This question already has answers here:
What is “2's Complement”?
                                
                                    (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/

10-09 00:47