2015-06-02 85 views
0

我有一個相當簡單 - 但對我來說混亂 - 問題。 假設字節variabels A,B,C:無法從int轉換爲字節

byte a = 5; 
byte b = 3; 
byte c = a + b; // wont compile 

3號線不會編譯,因爲 - 我想 - Java有做幕後的計算,計算的結果是一個整數。如果沒有顯式轉換,整數不能傳遞給一個字節。所以應該提供(字節)(a + b)。但現在假設有代碼與顯式的整數4號線...

c = (int) 8 ; // compiles 

編譯雖然字節variabel「C」明確鑄造到整數。 Java如何處理這個方面......?

+0

字節有自己的操作符。 http://www.tutorialspoint.com/java/java_bitwise_operators_examples.htm,它們不是整數。 – Tschallacka

+0

看起來像以前一樣。看看[這裏] [1]? [1]:http://stackoverflow.com/questions/18483470/is-addition-of-byte-converts-to-int-is-because-of-java-language-rules-or-因爲 – pjanssen

+0

嘗試'c =(int)128',你可能會自己知道差異! –

回答

1

你所沒有看到的是,a+b運行時操作而byte b = (int)8;編譯時操作。因此,在編譯期間,編譯器知道常量8可以適合一個字節。所以,明確轉換爲(int)忽略。字節碼在沒有或沒有(int)時沒有差別。現在

,在如果兩個字節變量是第一種情況下final(即,恆定的),則編譯器將允許這樣的:

public static void main(String[] args) { 
    final byte a = 5; // constant 
    final byte b = 3; // constant 
    byte c = a + b; // WILL compile; 

} 
0

點是字節爲8位的和int是32位整數值。舉例來說,當你在127下添加兩個字節數時,那麼它可能會增加超過127的結果,超出了字節範圍,並且默認情況下,Java對幾乎所有數字都使用int。

JVM doc說:

編譯器編碼類型的文字值的負荷字節和短期使用的Java虛擬機指令,在編譯時這些值符號擴展到int類型的值或運行時間。類型布爾型和字符型的字面值負載使用指令進行編碼,該指令在編譯時或運行時將文字零值擴展爲int類型的值。 [..]。因此,對於實際類型boolean,byte,char和short的值的大多數操作都可以通過對計算類型int的值進行操作的指令正確執行。

1

3號線不會編譯,因爲 - 我想 - Java有做幕後的計算,計算的結果是一個整數。

正確。

但現在假設有代碼使用顯式蒙上了4號線到整數

c = (int) 8 ; // compiles 

它編譯雖然字節variabel「C」明確鑄造到整數。

因爲你使用了文字值,8,並且編譯器知道8將適合在byte

一個更好的比較是:

c = (int)b; 

...它失敗。