You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:39:42