以下程式碼預期輸出 1000,實際卻輸出 5:
public class Change {
public static void main(String[] args) {
final long L1 = 24 * 60 * 60 * 1000 * 1000;
final long L2 = 24 * 60 * 60 * 1000;
System.out.println(L1 / L2); // 輸出 5
}
}
int 型別。24 * 60 * 60 * 1000 * 1000 過程中超出 int 最大值(2,147,483,647),導致溢出變成負數或錯誤值。long 變數,但此時資料已損毀。在第一個因數加上 L 後綴,強制整個運算以 long 進行:
final long L1 = 24L * 60 * 60 * 1000 * 1000;
final long L2 = 24L * 60 * 60 * 1000;
System.out.println(L1 / L2); // 輸出 1000
L(或 f/d 對應 float/double)。long,中間運算仍遵循「運算元型別決定運算型別」規則。-Xlint:overflow)輔助檢測。// 毫秒轉天數
long days = System.currentTimeMillis() / (24L * 60 * 60 * 1000);
// 避免溢出的時間計算
long start = System.nanoTime();
// ... 執行任務
long elapsedMs = (System.nanoTime() - start) / 1_000_000L;