为什么-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(与原来的结果一样)
---------------------------------
确实
------解决方案--------------------哎呀,楼上说的就是传说中的补码啊
------解决方案--------------------楼上正解