(23个答案)
去年关闭。
我正在测试Java中的按位not运算符。我以二进制形式打印了〜1的结果,它返回了“ 1111111111111111111111111111111010”,显然计算结果为-2。
我知道您必须对此加1才能得到-1,并且最左边的位仅显示该数字是正数还是负数,但是我不明白的是为什么一个如此大且具有1的二进制数求和只是-2
最佳答案
11111111111111111111111111111110
是原始位表示。 Java将two's complement用于带符号的值表示,其中第一位(如果已设置)表示负数。
Conversion from Two's Complement对此进行了很好的解释:
以数字0xFFFFFFFF为例。用二进制表示:
1111 1111 1111 1111 1111 1111 1111 1111
我们能说些什么?它的第一个(最左边)位为1,表示这表示一个负数。这就是事物取二的补码的方式:前导1表示数字为负,前导0表示数字为0或正。
要查看此数字是负数,我们反转该数字的符号。但是该怎么做呢?该类注释说(在3.17上),要反转符号,您只需将位反转(0变为1,1变为0),然后将结果加1。
该二进制数的求反显然是:
0000 0000 0000 0000 0000 0000 0000 0000
然后我们添加一个。
0000 0000 0000 0000 0000 0000 0000 0001
因此,0xFFFFFFFF
的负数是0x00000001
,通常称为1
。所以0xFFFFFFFF
是-1
。
上面说明了为什么0xFFFFFFFF
的2的补码的负数(如反向位和加一)为什么是1
,这意味着0xFFFFFFFF
本身就是-1
。以同样的方式,您的0xFFFFFFFE
值具有2
的负数,因此0xFFFFFFFE
本身就意味着-2
为二进制补码。
关于java - 11111111111111111111111111111110110如何评估为-2? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53654851/