天天看點

java 中 byte 溢出詳解,為什麼 byte 130 結果為 -126

public class Main {
    public static void main(String[] args) {
        byte b = (byte) 130;
        System.out.println(b); // -126
    }
}      

必備知識:

原碼、反碼、補碼

原碼:

就是二進制定點表示法,即最高位為符号位,“0”表示正,“1”表示負,其餘位表示數值的大小。

反碼:

正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符号位除外。

補碼:

正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。

回到正題

在 java 中 byte 130 的 130 預設是 int 類型(十進制),int 類型占用 4 個位元組。

将十進制的 130 轉化為二進制值為:

00000000 00000000 00000000 10000010      

使用 byte 130 意思是強制類型轉換,會将 int 類型強制轉換為 byte 類型,強制轉化過程會進行截取,結果為:

10000010      

通過截取後的結果可以看到,符号位(最高位)為 1,說明這是一個負數

在計算機中所有的資料都是以補碼的形式出現。是以求出截取後的資料的補碼即可。

原碼:10000010   
反碼:11111101        原碼變反碼,最高位符号位不變,其他位取反,0變1,1變0
補碼:11111110        反碼變補碼,末位加 1      

求得 原碼:10000010 的補碼為 補碼:11111110

最高位為符号位,為 1,代表負數。