为何C语言十进制转二进制代码中b变为1410065408而非100000000000?
问题分析与解决
问题根源
- 函数
binnar的返回类型是int,但内部变量b是long long类型。当b的值达到100000000000时,该数值远超出32位int的最大取值范围(通常为2147483647),返回时触发整数溢出,导致值被截断为1410065408。 void main并非标准C的合法写法,规范写法应为int main()并返回状态码。
修复后的代码
#include<stdio.h> // 将函数返回类型改为long long,匹配内部变量类型 long long binnar(int a){ long long int b = 0, x = 1; while(a != 0){ b += (a % 2) * x; x *= 10; a = a/2; } return b; } // 标准main函数实现 int main(){ int a = 1024; printf("%lld", binnar(a)); return 0; }
额外提示
这种通过构造十进制数来模拟二进制的方式存在局限性:当输入值对应的二进制位数过多时,即使long long也会出现溢出(比如超过18位左右)。更可靠的二进制转换方案是使用字符串存储结果,或者直接逐位输出二进制位。
内容的提问来源于stack exchange,提问作者harrypotter
相关产品推荐
相关产品推荐

