我初始化的字節如下:java - 爲什麼這個字節不會引起異常?
byte b = (byte) 0b11110000000;
因爲一個字節是大小的8位,我期待它會拋出一些異常或錯誤,因爲這數量應該是分配僅一個短或以上。它仍評估爲-124?或者這也許是「正常」的行爲? (沒有異常拋出,但變量溢出)?
我初始化的字節如下:java - 爲什麼這個字節不會引起異常?
byte b = (byte) 0b11110000000;
因爲一個字節是大小的8位,我期待它會拋出一些異常或錯誤,因爲這數量應該是分配僅一個短或以上。它仍評估爲-124?或者這也許是「正常」的行爲? (沒有異常拋出,但變量溢出)?
你應該得到-128
。
當您明確地將int
轉換爲byte
時,將採用最低8位,其餘部分將被丟棄。
在你的例子中,最低的8位是10000000
,那個數字的十進制值是-128
。
如果沒有顯式強制轉換,代碼將無法通過編譯,因爲您的任務會導致信息丟失。
這裏:
byte b = (byte) 0b11110000000;
0b11110000000
爲int
字面即正在縮小轉換爲byte
。
一個字節是一個8位帶符號的二進制補碼整數。
其最小值爲-128其最大值爲127
字節表示的最大值是
1111111
而且
10000000
溢出的1 最大值所以,溢出到字節最小值的下一個值:-128
請記住,您正在播放:
(byte) 0b11110000000;
一切後(MSB)的8位將被丟棄...
這意味着:alll後面的字節初始化將被trucated -128(1000_0000或第一次8位)
byte b = (byte) 0b1000_0000;
System.out.println(b);
b = (byte) 0b1111_1000_0000;
System.out.println(b);
b = (byte) 0b1111_1111_1000_0000;
System.out.println(b);
b = (byte) 0b1111_1111_1111_1000_0000;
System.out.println(b);
b = (byte) 0b1111_1111_1111_1111_1000_0000;
System.out.println(b);
b = (byte) 0b1111_1111_1111_1111_1111_1000_0000;
System.out.println(b);
b = (byte) 0b1111_1111_1111_1111_1111_1111_1000_0000;
System.out.println(b);
// even here with longs as bin
b = (byte) 0b1111_1111_1111_1111_1111_1111_1111_1000_0000L;
System.out.println(b);
如果你想看到錯誤,擺脫演員陣容。
byte b = 0b11110000000;
這會給你「不兼容的類型:可能有損從int轉換爲字節。」
由於您明確將該值與(byte)
一起轉換,因此Java編譯器假定您知道自己在做什麼。
我認爲它被稱爲加寬原始轉換。
5.1.2。寬元轉換
19對原始類型特定的轉換被稱爲寬元的轉換:
字節short,int和長整型,浮點或雙
有關詳細信息,您可以參考以下鏈接: https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html
所以是的:這是「正常*」的行爲。但我不知道他們爲什麼這樣設計,任何人都有想法? – Zabuza
@Zabuza好吧,如果你只對'int'的最低8位感興趣,你可以使用這個顯式類型將它們分配給一個'byte'。就像如果你只對'float'的double類型的整數部分感興趣的話,你可以明確地將它轉換爲int(或'long')並丟棄小數部分。 – Eran
啊,通過比較它聽起來有意義。 – Zabuza