問題
次のコードの出力はどうなるでしょうか?
int x = -2147483648;
long y = Math.abs(x);
System.out.println(y);
答え
-2147483648
解説
-
Integer.MIN_VALUEは-2147483648(= -2³¹)。 -
intの範囲は-2147483648 ~ 2147483647。 -
Math.abs(int)の戻り値はint型。 -
Math.abs(-2147483648)は理論上2147483648になるはずですが、この値はintの範囲を超えてしまいます。
その結果、オーバーフローが発生し、戻り値は変換できずにそのまま -2147483648 になります。
解決策
正しく long 型の正の値にしたい場合は、先に long にキャストしてから Math.abs(long) を利用する必要があります。
int x = -2147483648;
long y = Math.abs((long) x); // OK
System.out.println(y); // 2147483648 と出力
環境
- openjdk 25 2025-09-16
- javac 25