では「オーバーフローを実験するJavaプログラム」を、初心者でも理解しやすいように作ってみましょう。
(「オーバーフロー」とは、変数に入る最大の値を超えてしまったときに、値が反対側に回り込んでしまう現象です)
まず知っておこう:オーバーフローとは
Javaでは、整数型(byte, short, int, long)には「表せる範囲」があります。
| 型 | 最小値 | 最大値 |
|---|---|---|
| byte | -128 | 127 |
| short | -32,768 | 32,767 |
| int | -2,147,483,648 | 2,147,483,647 |
| long | -9,223,372,036,854,775,808 | 9,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 |
練習アイデア
以下のようなことを自分で試してみると理解が深まります👇
shortやint、longでも同じ現象を確認するSystem.out.println(Integer.MAX_VALUE + 2);などを試す- オーバーフローが発生しないように
longに型を変える

