#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;
}
我使这个程序将二进制转换为十进制。 网上有很多代码,但我想知道 这段代码一切正常吗?
答案 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)
您的代码确实存在一些问题:
scanf
是否失败。成功时,scanf
返回成功填充的参数列表中的项目数,因此如果返回值不是1(在您的情况下),则应该打印错误并停在那里。pow
。将整数乘以2的幂与将其向左移动相同,但更快,因为您没有调用返回double
的函数。将*pow(2, i)
替换为<< i
,您会得到相同的结果。这要好得多:
#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;
}