4

~0 是否意味着将 000000000 翻转为 1111111111?

printf("Check: %i", ~0);

printf 结果为-1,这就是我感到困惑的原因。
-1 本质上与 11111111111111111 位的含义相同吗?

4

4 回答 4

17

~0 是否意味着将 000000000 翻转为 1111111111?

是的,它确实。

-1 本质上与 11111111111111111 位的含义相同吗?

2s 补码表示中,确实如此。

于 2012-08-31T20:29:20.743 回答
6
Does ~0 mean its flipping 000000000 to 1111111111?

是的,就是这个意思。

printf("Check: %i", ~0);

The printf results to -1, which is why I am confused.

这是因为 2 的补码算法,我们通常接受零作为

000000000000

并且从中减去一个需要一个需要借位的“借位”,依此类推,直到您“滚动”整个寄存器

111111111111

从逻辑上讲,如果你在那个数字上加“1”,它就会进位,然后进位,依此类推,直到它朝相反的方向“滚动”,000000000再次让步。

Does -1 essentially mean the same thing as 11111111111111111 bits?

是的,只要您使用 2 的补码有符号整数。

----已编辑,包括cincutar现已删除的帖子中的详细信息(我希望他没有删除它)---

要查看格式化为(无符号)十六进制数的相同内存,请使用命令

printf("Check: %x", ~0);

这将打印输出

Check ffffffff

这是(对于那些不阅读十六进制的人)

11111111111111111111111111111111
于 2012-08-31T20:33:08.593 回答
3

~0 == 0xFFFFFFFF

其中 0xFFFFFFFF= 32 乘以 1 ,即2 的补充表示中的 -1

因为~是按位运算,并且在每个位中将零变为一:

~0b1010 == 0b0101
于 2012-08-31T20:30:38.660 回答
3

这是由于数学运算“二进制补码”。可以在 youtube 上找到一个不错的补码视频教程。这是其中之一:)

优酷链接

于 2012-08-31T20:31:28.387 回答