看看这个编译器:
代码非常简单:
cout << ~5;
这输出-6
现在我不是C ++大师,但不知怎的,我记得〜操作符应该翻转一个数字位,因为5是101,我希望得到010,这是2,或者更准确地说是5是0000 .. .... 101我应该得到1111 ... 010这应该是一个非常大的负数而不是6(110)。问题是:我对操作员有误,还是我错过了什么?
答案 0 :(得分:4)
负整数通常用two's complement表示。 这允许诸如加法和减法之类的基本操作与负数一起使用,其方式与正数相同。在该形式中,否定表示为:
00000000 = 0
11111111 = -1
11111110 = -2
11111101 = -3
11111100 = -4
11111011 = -5
11111010 = -6
确实-6 = ~5
答案 1 :(得分:0)
这实际上是关于两个补充的微妙之处。
我将以16的数字写出你的数字,大小与变量相同(我假设32位,但你可以改变其他大小的答案)。
5
是0x00000005
。 ~5
是否定,0xFFFFFFFA
。添加5
,您看到~5 + 5
为0xFFFFFFFF
。再添加一个,由于溢出,您会收到0x00000000
或0
。
两个补码表示使得增加超过0x7FFFFFFF
(或2147483647
)是实际溢出(而0x80000000
是-2147483648
),并且只是从-1
到0
的增量不会导致溢出。
您可以阅读有关two's complement representation的更多信息,如果您愿意,还可以向我索取更多信息。