HOWTO · Java

Java での整数オーバーフローとアンダーフローの処理

このチュートリアルでは、Java での整数のオーバーフローとアンダーフローの処理について説明します。

このページの内容

この記事では、整数データ型のオーバーフローとアンダーフロー、およびこの問題の処理について説明します。

Java における整数のオーバーフローとアンダーフローの概要

整数値を扱う場合、オーバーフローまたはアンダーフロー エラーが発生する可能性があります。 宣言されたデータ型の範囲外の値を割り当てるなど、変数を間違って宣言すると発生します。

ご存じのとおり、以下に示すように、さまざまなサイズを含む 4つのレベルの整数データ型があります。

データ・タイプ サイズ
byte 8ビット
short 16 ビット
int 32ビット
long 64 ビット

Java の int を考えると、割り当てることができる値の範囲があります。 すでに知っているように、その int データ型はサイズが 32 ビット です。 したがって、int で許容される値の範囲は -2147483648 から 2147483647 の間です。

Integer.MAX_VALUEInteger.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)

整数オーバーフローの処理

上記の例を解決するには、値の範囲を増やす必要があります。 この場合、integerlong に型キャストします。 上記の例の更新されたコードは次のようになります。

コード例:

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

したがって、オーバーフローまたはアンダーフローの問題を解決するには、データ型の範囲を増やす必要があります。