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
したがって、オーバーフローまたはアンダーフローの問題を解決するには、データ型の範囲を増やす必要があります。
Aminul Is an Expert Technical Writer and Full-Stack Developer. He has hands-on working experience on numerous Developer Platforms and SAAS startups. He is highly skilled in numerous Programming languages and Frameworks. He can write professional technical articles like Reviews, Programming, Documentation, SOP, User manual, Whitepaper, etc.
LinkedIn関連記事 - Java Error
- $' ': Java の Command Not Found エラーを修正
- Class X Is Public を X.java という名前のファイルで宣言する必要がある問題を修正
- Eclipse エラー: 選択を起動できません
- Eclipse で Java ランタイム環境を続行するにはメモリが不足しています
- Eclipse の`Java 仮想マシンが見つかりませんでした`というエラーを修正する
- IntelliJ IDEA のスレッド メイン Java.Lang.ClassNotFoundException での例外