十进制转二进制程序显示错误?0x80替换为0x80000000生效的原因
为什么用0x80无法正确输出long int的二进制?
#include <stdio.h> #include <stdlib.h> int main() { long int x; x = 1000000; printf("%ld\n", x); for(int i = 0; i < 32; i++) { printf("%c", (x & 0x80)? '1' : '0'); x <<= 1; } printf("\n"); return 0; }
核心原因:位掩码的位数不匹配
你的代码目标是输出32位long int的完整二进制,但0x80这个掩码只对应第7位(从0开始计数,2^7 = 128),而非32位整数的最高位(第31位)。
- 当你用
x & 0x80时,每次仅检查x的第7位是否为1,而非整个32位数值的最高位。初始值x=1000000的二进制仅占20位,前12位都是0,所以前24次循环中,第7位始终为0,输出全是0;直到移位到后续位时才会输出1,完全偏离了“从最高位到最低位输出完整二进制”的需求。 - 换成
0x80000000后,这个掩码对应32位整数的最高位(第31位)(2^31 = 2147483648,十六进制为0x80000000)。每次左移一位后,掩码会依次覆盖从最高位到最低位的每一位,这样就能正确输出32位的完整二进制表示。
补充说明
如果你的系统中long int是64位,对应的最高位掩码应该是0x8000000000000000,但你的循环只执行32次,所以0x80000000刚好匹配32位的输出需求。
内容的提问来源于stack exchange,提问作者Wasabi
相关产品推荐
相关产品推荐

