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