Java中基本數據類型byte的溢出問題
問題源於:[Day2](file:///F:/github/JavaFile/JavaBasic/JavaSEBasic/Day2.md)
定義兩個byte類型的數據,將其之和賦值給一個新的byte類型數據
byte b1 = 1;
byte b2 = 2;
byte b = (byte)(b1+b2);
System.out.println(b);
此時結果為3,與預期一致
byte類型的數據范圍為-127~128,猜想,若此時將上述代碼改成
byte b1 = 67;
byte b2 = 89;
byte b = (byte)(b1+b2);
System.out.println(b);
此時編譯器會不會報錯?
進入cmd執行命令
結果是-100?!
上面提到byte類型的取值范圍是-128~127
這個輸出結果是由java編碼方式決定的,Java中正數用原碼表示,負數用補碼表示,第一位是符號位,正數和0用0標記,負數用1標記。
byte類型的數據占用1字節,即8位,但是在進行相加運算時,系統會自動轉換為int類型(4字節)進行運算
int型整數67的二進制為 0000 0000 0000 0000 0000 0100 0011
int型整數89的二進制為 0000 0000 0000 0000 0000 0101 1001
相加后,得到的int型整數156的二進制為 0000 0000 0000 0000 0000 1001 1100
在經過強制類型轉換(byte)后,其結果為 1001 1100
編碼的最高位為1,所以編譯器認為這是一個負數
而上述提到,負數用補碼表示,需要轉換為原碼,故取反加1
取反 0110 0011
加1 0110 0100
也就是100,因為是負數所以添上符號,結果為-100。
參考資料:
byte類型取值范圍以及溢出詳解|CSDN
https://blog.csdn.net/benjamin_whx/article/details/38704077