天天看點

Java上溢與下溢的原了解析

這涉及到計算機中數值的表示方法,計算機中整型數值是用【補碼】來表示的。

詳情可以參考這裡:《原碼, 反碼, 補碼 詳解》

簡單的說,就是用位元組的最高位表示符号的正負,0代表正,1代表負;但是這個符号位也會參與運算,java的int是4個位元組,每個位元組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))吧