2017-08-16 214 views
3

我初始化的字節如下:java - 爲什麼這個字節不會引起異常?

byte b = (byte) 0b11110000000; 

因爲一個字節是大小的8位,我期待它會拋出一些異常或錯誤,因爲這數量應該是分配僅一個短或以上。它仍評估爲-124?或者這也許是「正常」的行爲? (沒有異常拋出,但變量溢出)?

回答

6

你應該得到-128

當您明確地將int轉換爲byte時,將採用最低8位,其餘部分將被丟棄。

在你的例子中,最低的8位是10000000,那個數字的十進制值是-128

如果沒有顯式強制轉換,代碼將無法通過編譯,因爲您的任務會導致信息丟失。

+0

所以是的:這是「正常*」的行爲。但我不知道他們爲什麼這樣設計,任何人都有想法? – Zabuza

+0

@Zabuza好吧,如果你只對'int'的最低8位感興趣,你可以使用這個顯式類型將它們分配給一個'byte'。就像如果你只對'float'的double類型的整數部分感興趣的話,你可以明確地將它轉換爲int(或'long')並丟棄小數部分。 – Eran

+0

啊,通過比較它聽起來有意義。 – Zabuza

0

這裏:

byte b = (byte) 0b11110000000; 

0b11110000000int字面即正在縮小轉換爲byte

一個字節是一個8位帶符號的二進制補碼整數。
其最小值爲-128其最大值爲127
字節表示的最大值是

1111111 

而且

10000000 

溢出的1 最大值所以,溢出到字節最小值的下一個值:-128

0

請記住,您正在播放:

(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); 
1

如果你想看到錯誤,擺脫演員陣容。

byte b = 0b11110000000; 

這會給你「不兼容的類型:可能有損從int轉換爲字節。」

由於您明確將該值與(byte)一起轉換,因此Java編譯器假定您知道自己在做什麼。

相關問題