byte b = 3; 這行代碼中,整數常量 3 最終是以 byte 還是 int 處理?網上說法不一,究竟如何?
Java 編譯器將整數字面量視為 int 型別處理,再進行隱含縮小轉換。 這是由 Java 語言規範(JLS)定義的「賦值語境下的縮小基本型別轉換」所允許的特例。
// 原始碼
byte b = 120;
// javap -c 反編譯結果片段
0: bipush 120 // 將 int 常量 120 推入棧頂
1: i2b // int → byte 截斷轉換
2: istore_1 // 存入區域變數表(仍佔 4 位元組 slot)
關鍵指令 bipush / sipush 皆操作 int,隨後由 i2b/i2s 截斷。編譯期常量若在目標型別範圍內,允許隱含轉換;變量則需強制轉型。
「若表達式為
int常量表達式,且值在目標型別範圍內,允許隱含縮小基本型別轉換。」
這解釋了為何 byte b = 3; 合法,而 int i = 3; byte b = i; 需 (byte)i。
javap -c 驗證字節碼,養成查證習慣。byte/short 運算(JVM 內部統一按 int 處理,頻繁轉換反而增加指令)。結論:本質上是 int 處理,編譯器在賦值語境下自動插入截斷指令。