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

MD Aminul Islam 2023年10月12日
  1. Java における整数のオーバーフローとアンダーフローの概要
  2. Java の整数オーバーフロー
  3. 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

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

著者: MD Aminul Islam
MD Aminul Islam avatar MD Aminul Islam avatar

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 Integer