2

使用下面的代码,我声明了一个 unsigned int 并将其赋值为 236。然后我取它的 1 的补码并将其分配给一个单独的变量。使用 printf 打印时,我希望第二个变量打印为“19”,但打印为“4294967059”。为什么?~ 位运算符不是取第一个变量(基数 2)的值并“翻转”位(1 的补码),导致基数为 10 的“19”吗?我机器上的整数是 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?
4

2 回答 2

4

如果 unsigned int 的长度为 4 个字节,a则为 is的二进制。是,即 4294967295。00000000 00000000 00000000 11101100~a11111111 11111111 11111111 00010011

您可以使用 unsigned char 来表示单个字节(很可能是 8 位)。

unsigned char a = 236;
unsigned char b = ~a;  // b = 19
于 2013-09-07T04:41:23.083 回答
2

我机器上的整数是 32 位的

当您说int您的机器是 32 位时,为什么您只考虑 8 位?

236 => 00000000000000000000000011101100

1的补码是

11111111111111111111111100010011 => 4294967059

于 2013-09-07T04:39:06.063 回答