Java中基本數據類型byte的溢出問題


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執行命令

3ReF8H.png

結果是-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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM