C语言十进制转16BIT二进制char数组问题求助
解决16位十进制转二进制的两个问题:乱码输出与顺序颠倒
我来帮你排查这两个代码问题,都是转二进制时很容易踩的小坑~
问题1:bin() 函数输出乱码
你看到的奇怪乱码,根源是数组索引越界+未初始化的内存。咱们看这段循环代码:
for (int i = 0; i < BIT; i++) { if (x % 2 == 0) { new[BIT - i] = '0'; } else { new[BIT - i] = '1'; } x = x / 2; }
当i=0时,BIT - i = 16,而你已经把new[16]设为字符串终止符'\0',这直接把终止符覆盖了;更关键的是,循环结束后new[0]根本没被赋值,还是malloc分配的随机垃圾内存,所以打印时会先输出一堆乱码,后面才是你生成的部分字符。
修复方案:把索引改成BIT - 1 - i,这样循环会从数组的第15位(倒数第二位)开始往前赋值,既不会覆盖终止符,也能把所有16位都填满:
char *bin(int x) { // 把变量名new换成result,避免和C关键字冲突 char *result = (char*)malloc(sizeof(char) * BIT + 1); result[BIT] = '\0'; if (x >= 0 && x <= 65535) { for (int i = 0; i < BIT; i++) { result[BIT - 1 - i] = (x % 2 == 0) ? '0' : '1'; x = x / 2; } } return result; }
另外提醒下:new是C++的关键字,虽然有些C编译器允许使用,但换成result这类普通变量名更稳妥。
问题2:binary() 函数输出顺序颠倒
这个问题很直观:你用x%2取的是当前数的最低位,然后直接打印,所以先输出的是二进制的最低位,最后输出的是最高位,自然顺序就反过来了。
给你两种修复方式:
方式1:从最高位到最低位依次计算输出
直接生成对应位的掩码,从2^15(16位的最高位)开始判断每一位的值:
void binary(int x) { if (x >= 0 && x <= 65535) { // 从最高位(2^15)遍历到最低位(2^0) for (int i = BIT - 1; i >= 0; i--) { int mask = 1 << i; // 生成2^i的掩码 printf("%c", (x & mask) ? '1' : '0'); } } }
方式2:先存数组再正向输出
和修复后的bin()思路一致,先把每一位存到临时数组里,再从前往后打印:
void binary(int x) { if (x >= 0 && x <= 65535) { char temp[BIT + 1]; temp[BIT] = '\0'; for (int i = 0; i < BIT; i++) { temp[BIT - 1 - i] = (x % 2 == 0) ? '0' : '1'; x = x / 2; } printf("%s", temp); } }
修复后测试,调用binary(16)会输出0000000000010000,bin(16)返回的字符串也是这个正确结果。
内容的提问来源于stack exchange,提问作者Paul Nie
相关产品推荐
相关产品推荐

