在計算機中,數值是以二進制補碼形式存儲的,java 也不例外。
8 位二進制補碼的范圍為 -128~127(-27 ~ 27 - 1);byte 的范圍就是 8 位二進制補碼的范圍。
那么,問題來了。8 位二進制補碼為什么能表示 -128 呢?
補碼中第一位是符號位,只有剩下的七位是數值位,即

數值位全為 1 時,最大值為 -27 - 1 ,即 -127;如果再加 1 就會發生溢出變成 1000 0000。
在補碼中只有一個 0 ,即 0000 0000,+0;而 -0 ,1000 0000 在補碼中規定用來表示 -128,也就是補碼中的一種 數碼結合 形式,符號位也表示數值位。
上面只是說規定 1000 0000 表示 -128,那么, -128 的補碼可以通過計算出來嗎?
答案是可以的,我們可以通過無符號數來計算出補碼(無符號數的補碼原碼和反碼都是一樣的)。

有符號數可以通過模運算來獲得對應的無符號數(n 位二進制數的模為 2n,即 8 位二進制數的模為 256):

當 0<= x <= 27 時,x無 = x
當 -27 <= x < 0 時,x無 = x + 28
