这个二进制到十进制的程序是否正确?

时间:2017-06-06 20:39:26

标签: c binary numbers decimal

#include <stdio.h>
#include <math.h>


int main() {
    long long int bin;
    int dec=0,i;

    scanf("%lld", &bin);
    for(i=0; bin!=0; i++){
        if(bin%10==0 || bin%10==1){
            dec+=(bin%10)*pow(2,i);
            bin/=10;
        }
        else {
            printf("Invalid Binary number!!\n");
            return 0;
        }

    }
    printf("%d\n", dec);


    return 0;
}

我使这个程序将二进制转换为十进制。 网上有很多代码,但我想知道 这段代码一切正常吗?

2 个答案:

答案 0 :(得分:1)

最好逐个字符地阅读并直接转换为机器编号。这更明确地表达了你的意图。

#include <stdio.h>
#include <limits.h>

int main(void)
{
    unsigned long long n = 0;
    int c;
    fputs("enter a number in base 2: ", stdout);
    while ((c = getchar()) != EOF && c != '\n') {
        if (n >= (ULLONG_MAX >> 1) + 1) {
            fprintf(stderr, "binary number is too large\n");
            return 1;
        }
        n <<= 1;
        if (c == '0')
            n += 0;
        else if (c == '1')
            n += 1;
        else {
            fprintf(stderr, "bad binary digit '%c'\n", c);
            return 1;
        }
    }
    printf("that number in base 10 is %llu\n", n);
    return 0;
}

完全未经测试。负数作为练习留下(注意:转移到有符号整数的符号位会引发未定义的行为)。

答案 1 :(得分:0)

您的代码确实存在一些问题:

  1. 您应该始终检查scanf是否失败。成功时,scanf返回成功填充的参数列表中的项目数,因此如果返回值不是1(在您的情况下),则应该打印错误并停在那里。
  2. 您根本不需要使用pow。将整数乘以2的幂与将其向左移动相同,但更快,因为您没有调用返回double的函数。将*pow(2, i)替换为<< i,您会得到相同的结果。
  3. 从可用性的角度来看,您应该将消息打印到屏幕上。
  4. 这要好得多:

    #include <stdio.h>
    #include <math.h>
    
    
    int main() 
    {
        long long int bin;
        int dec=0,i;
        printf("Enter a number in base 2: ");
        if(scanf("%lld", &bin)!=1)
        {
            printf("Error reading your input.");
            return -1;
        }
        for(i=0; bin!=0; i++)
        {
            if(bin%10==0 || bin%10==1)
            {
                dec+=(bin%10) << i;
                bin/=10;
            }
            else
            {
                printf("Invalid Binary number!!\n");
                return 0;
            }
    
        }
        printf("That number in base 10 is: %d\n", dec);
    
    
        return 0;
    }