使用以下代码,我声明一个unsigned int并为其赋值236.然后我取1的补码并将其赋值给一个单独的变量。当用printf打印时,我希望第二个变量打印为“19”,但打印为“4294967059”。为什么? 〜按位运算符是否取第一个变量(基数2)的值并“翻转”这些位(1的补码),在基数10中产生“19”?我的机器上的Int是32位,我认为这与2 ^ 32-1(4294967295)有关,但我还没弄明白
unsigned a = 236; // binary of this 11101100 = 236 base 10
unsigned b = ~a; // 1's complement to 00010011 = 19 base 10
printf("a: %u b: %u",a,b); // prints 236 and 4294967059. WHY?
答案 0 :(得分:4)
如果unsigned int的长度为4个字节,则a
的二进制值为00000000 00000000 00000000 11101100
。 ~a
为11111111 11111111 11111111 00010011
,即4294967295。
您可以使用unsigned char表示单个字节(很可能是8位)。
unsigned char a = 236;
unsigned char b = ~a; // b = 19
答案 1 :(得分:2)
“我机器上的Ints是32位”
当你说机器上的int
是32位时为什么你只考虑8位?
236 => 00000000000000000000000011101100
1的补充是
11111111111111111111111100010011 => 4294967059