2015-11-03 42 views
0

任何人都可以阐明为什么j仍然保持负值。Integer.MIN_VAL仍显示负值

int i=Integer.MIN_VALUE; 
    System.out.println(i); //output, -2147483648 
    int j=-i; 
    System.out.println(j); // output, -2147483648 
+1

请与您所使用的语言添加一个标签(单击 “编辑”,在问题的底部)。 – kebs

+0

因为JAVA的'Integer.MAX_VALUE'是'2147483647'。为什么它回退到MIN_VALUE我不知道。也许有些JAVA大师会解释这一点。 –

回答

1
Integer.MIN_VALUE = -2147483648 
Integer.MAX_VALUE = 2147483647 

因此,如果您切换MIN_VALUE的符号,你应该得到2147483648这是一个溢出。

2

Integer.MIN_VALUE是-2 (0x80000000)和Integer.MAX_VALUE的是2 -1(0x7fffffff)。

如果您否定Integer.MIN_VALUE,您将得到2 ,这比Integer.MAX_VALUE多1,因此它不适合。超出最大值后,它会变成负值。

计算机计算值为a的否定如下:NOT(a) + 1。 所以,让我们说,我们要通过否定1计算-1

  • 我们采取0x00000001
  • 应用NOT:0xffffffe
  • 增量:0xffffffff

,并反向,否定-1:

  • 采取0xffffffff
  • 申请NOT:0x00000000
  • 增量:0x00000001

类似地,否定-2 :

  • 采取0x80000000
  • NOT:0x7fffffff(Integer.MAX_VALUE的)
  • 增量:0x80000000(Integer.MIN_VALUE的)