C打印中的无符号整数不正确

时间:2013-09-07 04:34:39

标签: c types bitwise-operators bit

使用以下代码,我声明一个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?

2 个答案:

答案 0 :(得分:4)

如果unsigned int的长度为4个字节,则a的二进制值为00000000 00000000 00000000 11101100~a11111111 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