char/byte/short類型的加法和類型轉換問題

前天做360校招內推筆試題,其中有一道byte類型加法的問題:

byte b1=1,b2=2;

b3=b1+b2;

final byte b4=4,b5=5;

b6=b4+b5;

問b3和b5能否正常賦值?

答案應該是:b3不能正常賦值,需要類型轉換,b3=(byte)(b1+b2);b6能夠正常賦值。


原因分析:

在Java中,在基本類型進行算術運算的時候,會發生小字節類型向大字節類型轉換的現象。對於short,byte,char 比int 字節數小的變量類型來說,運算結果會自動轉換爲int類型。Java編譯器會在編譯期或者運行期將byte和short類型的數據帶符號擴展爲相應的int類型數據,將boolean和char類型數據零位擴展爲相應的int類型數據。因此,在處理boolean 、byte、short 和 char 類型的數組是,也會用相應的int類型的字節碼指令來處理。因此,大多數對於上述類型數據的操作,實際上都是使用相應的 int 類型作爲運算類型。如下:

short a=1, b=2;
short c=a+b;
System.out.println(c);

在編譯時,會報出“Exception in thread "main" java.lang.Error: Unresolved compilation problem: Type mismatch: cannot convert from int to short”,可以看出可以看出a+b結果變成了int類型。

重點來了,如果是final 修飾的變量,進行運算的時候則不會出現類型轉換異常。

final short a=1, b=2;
short c=a+b;
System.out.println(c);

這麼操作完全OK,究其原因,對於final 修飾的基本類型的變量來說,他們之間的運算直接就被硬編碼成了直接賦值語句,連中間結果都沒有了,類型轉換的異常也就沒了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章