long (64 位) → int (32 位) 屬於窄化轉型,高 32 位會被直接截斷,可能導致數值溢出、符號翻轉。務必確認數值範圍在 [-2^31, 2^31-1] 內,否則結果不可預期。
long ll = 300_000L;
int ii = (int) ll; // 300000
// 溢出示例
long big = 3_000_000_000L; // 超過 Integer.MAX_VALUE
int overflow = (int) big; // -1294967296 (補碼截斷)
long ll = 300_000L;
int ii = Long.valueOf(ll).intValue(); // 或 new Long(ll).intValue() (已棄用)
本質仍調用 (int) value,編譯器會優化為直接轉換指令。
long ll = 300_000L;
int ii = Integer.parseInt(String.valueOf(ll));
// 或 Integer.valueOf(String.valueOf(ll))
public static int safeLongToInt(long value) {
if (value < Integer.MIN_VALUE || value > Integer.MAX_VALUE) {
throw new ArithmeticException("long 值超出 int 範圍: " + value);
}
return (int) value;
}
// Java 8+ 標準庫法
int ii = Math.toIntExact(ll); // 自動檢測溢出並拋出 ArithmeticException
| 方法 | 吞吐量 | 備註 |
|---|---|---|
| (int) value | 最高 | 單條 CPU 指令,JIT 內聯 |
| Long.valueOf().intValue() | 同最高 | 編譯器優化消除對象創建 |
| Math.toIntExact() | 略低 | 含範圍檢查分支 |
| String.valueOf + parseInt | 低 2-3 數量級 | 內存分配、字符串解析開銷 |
(int) longVal。Math.toIntExact() (Java 8+)。