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