日期:2014-05-20  浏览次数:20706 次

为什么-Integer.MIN_VALUE还是等与Integer.MIN_VALUE呢???
今天发现一个奇怪的现象,我根据这个现象写了一个简单的程序:
 
public class Simple {
  public static void main(String[] args) {
  int a=Integer.MIN_VALUE;
  int b=-a;
   
  if (b==a) {
  System.out.println("******b==a*******");
  }else{
  System.out.println("******b!=a*******");
  }
   
  if (b==Integer.MAX_VALUE){
  System.out.println("b==Integer.MAX_VALUE");
  }else {
  System.out.println("b!=Integer.MAX_VALUE");
  }
   
  }
}

我知道Integer.MIN_VALUE=-2147483648 而 Integer.MAX_VALUE=2147483647
所以上面程序中b就超出int的范围了,也肯定不等于Integer.MAX_VALUE,
但我的问题是:为什么-Integer.MIN_VALUE还是等与Integer.MIN_VALUE呢???

------解决方案--------------------
我是这样理解的
-Integer.MIN_VALUE=2147483648
16位2进制数,2147483648=-2147483648
所以
-Integer.MIN_VALUE等与Integer.MIN_VALUE
------解决方案--------------------
Integer.MIN_VALUE,即 -2147483648,二进制位如下:

1000 0000 0000 0000 0000 0000 0000 0000

在计算机的运算中,“-”(前缀)运算表示各二制位取反再加1,也就是说 b = -a 在计算机内部是 b = ~a + 1 这样处理的,所以上面的位就变成了:

   1000 0000 0000 0000 0000 0000 0000 0000 Integer.MIN_VALUE
取反 0111 1111 1111 1111 1111 1111 1111 1111 (取反之后变成了 Integer.MAX_VALUE)
加1 1000 0000 0000 0000 0000 0000 0000 0000 -Integer.MIN_VALUE(与原来的结果一样)
------解决方案--------------------
Integer.MIN_VALUE,即 -2147483648,二进制位如下: 

1000 0000 0000 0000 0000 0000 0000 0000 

在计算机的运算中,“-”(前缀)运算表示各二制位取反再加1,也就是说 b = -a 在计算机内部是 b = ~a + 1 这样处理的,所以上面的位就变成了: 

   1000 0000 0000 0000 0000 0000 0000 0000 Integer.MIN_VALUE 
取反 0111 1111 1111 1111 1111 1111 1111 1111 (取反之后变成了 Integer.MAX_VALUE) 
加1 1000 0000 0000 0000 0000 0000 0000 0000 -Integer.MIN_VALUE(与原来的结果一样)

---------------------------------
确实
------解决方案--------------------
哎呀,楼上说的就是传说中的补码啊
------解决方案--------------------
楼上正解