public class Test {
public static void main(String[] args) {
int a=Integer.MIN_VALUE;
System.out.println(Math.abs(a));
}
}
上面代码的结果是 true,这跟我们希望的结果相反,为什么绝对值函数没有得到正确结果呢,我们来看下源码
public static int abs(int a) {
return (a < 0) ? -a : a;
}
在 abs 的源码中,对于负数直接使用了加上负号来取法,但是我们知道,因为存在 0,int 的范围是 [-2^31,2^31-1],
所以最小的数 -2^31 加上负号对应的 2^31 其实超过了 int 对应的最大整数范围。我们再来从字节的角度分析一下,32 位太长了
这里我用 1 字节意思一下,数字在计算机内用补码表示
127: 0111 1111
-128: 1000 0000
按照加负号的取反过程,回顾一下组原的知识,负数取反是先所有位取反(包括符号为),再 +1
也就是 0111 111 再 +1, 于是有 1000 0000,这样原因和过程就一目了然了
扩展:从上面的字节表示我们还可以看出 Integer.MAX_VALUE+1=Integer.MIN_VALUE