Java | オーバーフローを実験するJavaプログラム

Java Java
スポンサーリンク

では「オーバーフローを実験するJavaプログラム」を、初心者でも理解しやすいように作ってみましょう。
(「オーバーフロー」とは、変数に入る最大の値を超えてしまったときに、値が反対側に回り込んでしまう現象です)


まず知っておこう:オーバーフローとは

Javaでは、整数型(byte, short, int, long)には「表せる範囲」があります。

最小値最大値
byte-128127
short-32,76832,767
int-2,147,483,6482,147,483,647
long-9,223,372,036,854,775,8089,223,372,036,854,775,807

たとえば byte 型の最大値は 127 なので、そこに 1を足すとどうなるか? を見てみましょう。


実験プログラム

public class OverflowTest {
    public static void main(String[] args) {
        byte b = 127; // byte型の最大値
        System.out.println("初期値 b = " + b);

        b++; // 1を足す
        System.out.println("b に 1 を足した後の値 = " + b);

        // int型でも試してみる
        int i = Integer.MAX_VALUE; // int型の最大値
        System.out.println("\nint の最大値 = " + i);

        i = i + 1; // 1を足す
        System.out.println("int に 1 を足した後の値 = " + i);
    }
}
Java

実行結果(例)

初期値 b = 127
b に 1 を足した後の値 = -128

int の最大値 = 2147483647
int に 1 を足した後の値 = -2147483648

解説

  • byte 型の範囲は -128〜127 です。
    127に1を足すと、最小値の -128 に戻るように見えます。
    これは、メモリ上で数値が「ビットの桁あふれ」を起こすためです。
  • int でも同じ現象が起こります。
    int の最大値 2147483647 に1を足すと、
    最小値 -2147483648 に戻ります。

応用:逆のパターン(アンダーフロー)

public class UnderflowTest {
    public static void main(String[] args) {
        byte b = -128; // byteの最小値
        System.out.println("初期値 b = " + b);

        b--; // 1を引く
        System.out.println("b から 1 を引いた後の値 = " + b);
    }
}
Java

実行結果

初期値 b = -128
b から 1 を引いた後の値 = 127

➡ 最小値からさらに1を引くと、今度は「最大値」側に回り込みます。
これを「アンダーフロー」といいます。


まとめ

用語意味
オーバーフロー最大値を超えたときに最小値に戻る127 + 1 → -128
アンダーフロー最小値を下回ったときに最大値に戻る-128 – 1 → 127

練習アイデア

以下のようなことを自分で試してみると理解が深まります👇

  1. shortintlong でも同じ現象を確認する
  2. System.out.println(Integer.MAX_VALUE + 2); などを試す
  3. オーバーフローが発生しないように long に型を変える

タイトルとURLをコピーしました