為什麼Math.abs(Integr.MIN_VALUE)==Integer.MIN_VALUE

jchen104發表於2019-01-19
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

相關文章