オーバーフローとアンダーフローとは何か?初心者にもわかりやすく解説!

こんにちは。ゆうせいです。
今回は、プログラミングや計算機の世界でとても重要なキーワードである、「オーバーフロー」と「アンダーフロー」について解説していきます。

この2つ、名前は似ていますが意味は正反対。
ただし、どちらも「コンピュータの限界を超えてしまったときに起こる現象」なんです。

「えっ、コンピュータに限界なんてあるの?」と思ったあなた。
とても良い感覚です!

では、具体的にどんなことが起きるのか、順を追って説明していきましょう。


オーバーフローとは?

計算結果が大きすぎて入りきらない!

オーバーフロー(overflow)とは、あるデータ型が表現できる上限を超えることで、正しい結果が保存できなくなる現象です。

例えるなら、コップに水を注ぎすぎて、あふれてしまう状態です。


整数型での例

たとえば、32ビットの符号付き整数(int)の範囲は:

−231~231−1(−2の31乗~2の31乗ひく1)→−2,147,483,648~2,147,483,647-2^{31} ~ 2^{31} - 1 (-2の31乗 ~ 2の31乗ひく1) → -2,147,483,648 ~ 2,147,483,647

このとき、

int a = 2147483647;
a = a + 1;

という計算を行うとどうなるか?
実は、aの値は -2,147,483,648(最小値)に戻ってしまいます

これがオーバーフローです。


なぜこんなことが起きるのか?

コンピュータは数をビットの並びで表現します。
そして、決められたビット数(たとえば32ビット)の範囲を超えると、繰り上がりが切り捨てられて、まるで回転したように反対側の値に戻ってしまうのです。


アンダーフローとは?

今度は「小さすぎて」表現できない!

アンダーフロー(underflow)は、実数型(float型など)でよく起きる現象です。

とても小さな数(0に限りなく近い値)を扱おうとしたとき、その値を表現するための精度が足りず、0になってしまうことがあります。

例えるなら、小さな砂粒があまりにも細かくて、ふるいをすり抜けて見えなくなってしまう状態です。


具体例:floatでのアンダーフロー

浮動小数点型(たとえば32ビットのfloat)は、扱える最小の値が決まっています。 最小正の数≈1.4×10−45(float型)最小正の数 ≈ 1.4 × 10^{-45} (float型)

このとき、

float x = 1e-46;

とすると、x0として扱われる可能性があります。
これは、あまりにも小さすぎて記憶できない=アンダーフローです。


図で理解しよう!

数直線(イメージ)

←─── アンダーフロー ─── 0 ─── オーバーフロー ───→

(アンダーフロー:精度不足で0になる)
(オーバーフロー:上限超えて値がぐるっと回る)

両者の違いを整理しよう!

項目オーバーフローアンダーフロー
起きる場所整数型・実数型のどちらでも主に実数型(float / double)
原因値が大きすぎる値が小さすぎる(ゼロに近い)
結果値が逆側に回る or 異常な値になる値が0になる
int x = 2147483647 + 1 →マイナス値にfloat y = 1e-500 に丸められる

よくある質問:オーバーフロー・アンダーフローはバグになるの?

答えは「場合による」です。

  • 数学的に正しい値と違う結果になるため、バグの原因になることは多いです。
  • ただし、制御された範囲内でわざと使うこともあります(たとえば、暗号化アルゴリズムやハッシュ関数など)。

対策はあるの?

あります!ここが大事です。

オーバーフロー対策

  • より大きなデータ型(long long, BigIntegerなど)を使う
  • 計算前に、上限に達するかどうかをチェックする
  • 使っている言語にオーバーフロー検出機能があれば活用する

アンダーフロー対策

  • 精度が必要な場合は、doubledecimalなどを使う
  • 数値のスケーリング(正規化)をして、0に近すぎる数を避ける
  • 科学計算では有効桁数を意識する!

最後に:これからどう学ぶ?

  • オーバーフローやアンダーフローが起きる具体的なコードを実際に動かしてみましょう!
  • 各言語でのデータ型の限界値(最大・最小)を調べてメモしておくと良いです。
  • IEEE754(浮動小数点数の標準)の仕様も、少しずつ読み解いていくと理解が深まります。

次回は、浮動小数点数における「誤差の連鎖(誤差伝播)」について学んでみるのもオススメです!
一見小さな誤差が、計算を繰り返すうちにどれほど大きなズレになるのか?――興味深いですよ!

また何か気になることがあれば、いつでも聞いてくださいね。

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。