在C中使用For实现十进制到二进制的转换

vkc1a9a2  于 2022-12-02  发布在  其他
关注(0)|答案(2)|浏览(201)

我不能在C语言中将十进制转换为二进制。每次我得到的输出都比所需的输出少一。例如:5应该是101,但显示为100或4应该是100,但显示为99。

#include<stdio.h>
#include<math.h>
void main() {
    int a,b=0;
    int n;
    printf("Enter a Decimal Number\n");
    scanf("%d",&n);
    for(int i=0;n>0;i++) {
        a=n%2;
        n=n/2;
        b=b+(pow(10,i)*a);
    }
    printf("%d",b);
}

我的输出总是比正确答案少一,我不知道为什么。如果一开始把b当作1而不是0,它就解决了这个问题,但我不知道为什么。请帮助。我几天前才开始使用C。

zi8p0yeb

zi8p0yeb1#

pow是浮点函数;它接受一个double参数并返回一个double值。在您正在使用的C实现中,pow的实现很糟糕。即使正确的结果是可以精确表示的,它也不总是产生正确的结果。请停止将它用于整数运算。
重写代码以使用整数算术计算所需的10的幂。
另外,不要通过在int类型中将二进制数字编码为十进制来计算二进制数字。这是浪费的,而且很快就会进入类型的界限。使用unsigned类型中的位或char的数组。当scanf("%d",&n);执行时,它将输入字符串转换为二进制并将其存储在n中。因此n已经是二进制的;你不需要解码它。2用一个循环找到它的最高位。3然后用另一个循环打印从那个位置到最低有效位的每一位。

huwehgph

huwehgph2#

这段代码看起来不错。我很快在一个在线编译器上测试了它,看起来工作得还可以。
我非常肯定它与不同版本的编译器有关。编译器,我在其中测试了您的代码:https://www.onlinegdb.com/online_c_compiler

编辑:

pow()函数在与整数一起使用时不可靠,因为您作为参数传递给它的整数被隐式转换为double数据类型,并返回double作为输出。当您再次将此值填充到整数中时,它将丢弃十进制值。一些编译器似乎使用其版本的pow()生成“正确”的结果,而一些编译器则没有。
相反,您可以使用不同的方法来解决十进制到二进制的转换,而不会在一般使用中出现错误:

#include<stdio.h>
void main() {
    int remainder,result = 0,multiplier = 1;
    int input;
    printf("Enter a Decimal Number\n");
    scanf("%d",&input);
    while(input){
        remainder = input%2;
        result = remainder*multiplier + result;
        multiplier*=10;
        input/=2;
    }
    printf("The binary version of the decimal value is: %d",result);
}

相关问题