为什么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
相关产品推荐
相关产品推荐

