2 回答

TA貢獻1820條經驗 獲得超10個贊
int類型二進制存儲的第一位為符號位,0
表示正數,1
表示負數,2147483647這個數字的的二進制表達為01111111111111111111111111111111
,加1以后的值為10000000000000000000000000000000
,而10000000000000000000000000000000
表示的是-2147483648這個數字.

TA貢獻1794條經驗 獲得超8個贊
這涉及到計算機中數值的表示方法,計算機中整型數值是用【補碼】來表示的。
詳情可以參考這里:《原碼, 反碼, 補碼 詳解》
簡單的說,就是用字節(jié)的最高位表示符號的正負,0代表正,1代表負;但是這個符號位也會參與運算,java的int是4個字節(jié),每個字節(jié)8位,所以int的最大值用二進制表示就是:
01111111 11111111 11111111 11111111;
將這個值加一時,從右往左一直進位,結果是:
10000000 00000000 00000000 00000000,
注意,最高位為1,表示負數,本來這個結果在原碼里代表-0,但是補碼消除了消除了+0和-0的冗余和歧義,使0只用一個表達方式就是:
00000000 00000000 00000000 00000000
反正放著“10000000 00000000 00000000 00000000”不用白不用,所以就用這個結果把補碼的表示范圍擴大一位,使其表達為最小值,而且這個值能滿足運算的結果表示,即(-2147483647) + (-1)等等結果確實是這個值;比如,如果用反碼,最小值是-2147483647,因為用的是補碼,所以這個值不用白不用,不讓它表示0,那就讓它表示-2147483648(-2147483647 + (-1))吧
添加回答
舉報