C语言二进制转十进制转换器出现逻辑错误 输出随机数
问题原因
- 访问未初始化的数组垃圾值:代码中数组
b从索引i=1开始存储输入的二进制位,但计算循环的终止条件为i>=0,当i=0时会读取从未赋值的b[0],该位置是栈内存的随机残留值,直接引入随机计算误差。仅当全1输入时刚好b[0]残留值为0,才会巧合得到正确结果。 - 位权与二进制位的对应关系颠倒:输入二进制时第一个读取的是最高位,但代码将其存入索引更小的数组位置,计算时给索引更小的位置匹配了更小的2的幂次,导致高位被赋予低位权重,计算逻辑本身就存在错误。
pow函数存在精度风险:pow是浮点数计算库函数,计算2的整数次幂时可能出现精度误差,比如pow(2,10)可能返回999.9999999,强转为int时会被截断为999而非正确的1024。
修复方案
无需额外数组存储二进制位,直接边读取边计算:每读取一位二进制数,就将当前十进制结果乘2(等价于二进制左移一位),再加上当前读取的位值,逻辑简单且完全规避上述问题。
修复后完整代码
#include <stdio.h> int main() { int decimal = 0; char ch; printf("enter binary\n"); ch = getchar(); while(ch != '\n') { decimal = decimal * 2 + (ch - '0'); ch = getchar(); } printf("%d", decimal); return 0; }
内容的提问来源于stack exchange,提问作者Larson Sequeira
相关产品推荐
相关产品推荐

