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

为什么C语言将十进制数转64位二进制时会出现比特位重复问题

根因分析
  • 输入参数类型错误:你定义的decToBinary函数接收int类型参数,主流编译环境下int为32位有符号整数,本身就无法容纳64位无符号数值,且有符号数的位运算存在符号位扩展风险。
  • 移位操作溢出:代码中1 << index的字面量1默认是32位int类型,当index大于等于32时,左移操作溢出属于C语言未定义行为,你遇到的场景下溢出后移位结果会绕回低32位,导致高32位的计算结果和低32位完全一致,也就是你观测到的比特位重复问题。
  • 位运算结果未归一化:1 << index & base_10_number的返回值是对应位的权值(比如第3位为1时返回8),直接赋值给bitmap后打印,除了最低位为1的场景,其他数值都会出现非0/1的异常输出,当前仅测试1时未暴露该问题。
修复后代码
#include <stdio.h>

// 参数替换为64位无符号整数类型
void decToBinary(unsigned long long base_10_number);

int main(void)
{
    decToBinary(1);
    return 0;
}

/* decToBinary: 输入无符号十进制数,输出对应的64位二进制表示 */
void decToBinary(unsigned long long base_10_number)
{
    unsigned short bitmap[64];

    for (int index = 0, pos = 63; index < 64; index++, pos--)
        // 用1ULL指定移位操作为64位无符号整数运算,同时将结果归一化为0/1
        bitmap[pos] = (1ULL << index & base_10_number) ? 1 : 0;
    
    for (int control = 0; control < 64; control++)
        printf("%i", bitmap[control]);
    
    putchar('\n');
}
验证效果

输入十进制数1时,输出结果为0000000000000000000000000000000000000000000000000000000000000001,符合预期。

内容的提问来源于stack exchange,提问作者HerrWeishaupt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 15:27:02