前天做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 修飾的基本類型的變量來說,他們之間的運算直接就被硬編碼成了直接賦值語句,連中間結果都沒有了,類型轉換的異常也就沒了。