HOWTO · Java
Java での整数オーバーフローとアンダーフローの処理
このチュートリアルでは、Java での整数のオーバーフローとアンダーフローの処理について説明します。
このページの内容
この記事では、整数データ型のオーバーフローとアンダーフロー、およびこの問題の処理について説明します。
Java における整数のオーバーフローとアンダーフローの概要
整数値を扱う場合、オーバーフローまたはアンダーフロー エラーが発生する可能性があります。 宣言されたデータ型の範囲外の値を割り当てるなど、変数を間違って宣言すると発生します。
ご存じのとおり、以下に示すように、さまざまなサイズを含む 4つのレベルの整数データ型があります。
| データ・タイプ | サイズ |
|---|---|
byte |
8ビット |
short |
16 ビット |
int |
32ビット |
long |
64 ビット |
Java の int を考えると、割り当てることができる値の範囲があります。 すでに知っているように、その int データ型はサイズが 32 ビット です。 したがって、int で許容される値の範囲は -2147483648 から 2147483647 の間です。
Integer.MAX_VALUE と Integer.MIN_VALUE を使用すると、最大値と最小値をすばやく取得できます。
Java の整数オーバーフロー
ここでは、整数オーバーフローの発生とその処理について説明します。
整数オーバーフローの発生
コード例:
public class IntegerOverflow {
public static void main(String[] args) {
int Intvalue = Integer.MAX_VALUE - 1;
for (int i = 0; i < 4; i++) {
System.out.println(Intvalue);
Intvalue = Math.addExact(Intvalue, 1);
}
}
}
上記のプログラムを実行すると、コンソールに次の出力が表示されます。
2147483646
2147483647
Exception in thread "main" java.lang.ArithmeticException: integer overflow
at java.base/java.lang.Math.addExact(Math.java:828)at IntegerOverflow.main(IntegerOverflow.java:9)
整数オーバーフローの処理
上記の例を解決するには、値の範囲を増やす必要があります。 この場合、integer を long に型キャストします。 上記の例の更新されたコードは次のようになります。
コード例:
public class IntegerOverflow {
public static void main(String[] args) {
int Intvalue = Integer.MAX_VALUE - 1;
long NewValue = (long) Intvalue; // Upgrading to new type
for (int i = 0; i < 4; i++) {
System.out.println(NewValue);
NewValue = Math.addExact(NewValue, 1);
}
}
}
これで、コンソールに以下の出力が表示されます。
2147483646
2147483647
2147483648
2147483649
Java の整数アンダーフロー
このセクションでは、Java の整数アンダーフローとその処理方法について学習します。
整数アンダーフローの発生
コード例:
public class IntegerUnderflow {
public static void main(String[] args) {
int value = -2147483699; // Creating underflow intentionally
System.out.println(value - 1);
}
}
上記のプログラムを実行すると、コンソールに次の出力が表示されます。
/IntegerUnderflow.java:3: error: integer number too large
int value = -2147483699; // Creating underflow intentionally
^
1 error
整数アンダーフローの処理
上記のエラーを解決するには、値の範囲を再度拡大する必要があります。そのためには、整数値を次のレベルに型キャストできます。 以下で共有されているコードを見てください。
コード例:
public class IntegerUnderflow {
public static void main(String[] args) {
long value = (long) -2147483638; // Type Casting
System.out.println(value - 1);
}
}
これで、コンソールに以下の出力が表示されます。
-2147483639
したがって、オーバーフローまたはアンダーフローの問題を解決するには、データ型の範囲を増やす必要があります。