曖昧さ回避
- 容器などから内容物が溢れること
- 1よりコンピュータの演算で数値が上限を超えること⇒本項で解説
- プログラミングでスタック(逐次入出力が繰り返されるデータを一時的に貯えるためのデータ構造)を利用し過ぎることで起きるエラー、スタックオーバーフロー
- アダルトゲームブランドの一つ。→overflow
- かいづか氏原作の成年コミック、及びそれを原作としたアニメ作品「おーばーふろぉ~挿れたら溢れる姉妹のキモチ~」。→おーばーふろぉ
概要
数値演算を行う際に計算可能な範囲を超えてしまう事を指す。
コンピュータでは2進数8桁を1つのバイトとして扱うことになり、このバイトを組み合わせる事で大きな数値を表現することも可能になる。例えば1バイトであれば符号無しならば0~255、符号有りならば-128~127までの数値を表現することが出来る。
例えば符号無しの1バイトで表現された2つの整数を足し合わせようとした際(以下、分かりやすいように全て10進数で表記する)にその答えが255以下であれば問題無く計算出来るのだが、答えによっては255を超えてしまうことがある。その場合はプログラムが予期しない挙動を示すという問題が起きる。例えば130+130を行うと1バイトでは255までしか表現することが出来ず、260という数値を正しく格納することが出来ない。具体的にはこの演算の答えを1バイトで無理やり表現して5と返ってくる、あるいは別の領域に保管されている数値を書き換えてしまう可能性が存在する。これがオーバーフローである。
また符号有りの場合であると正+正の演算を行ったにもかかわらずオーバーフローすると負の答えが返ってくる場合がある。
当然ながら演算の答えを何かしらの用途に利用しようとした場合は予期せぬ動作をする場合もあるしオーバーフローしたことによって隣のバイトの数値が書き換えられてしまった場合はその演算だけでは済まない不具合を引き起こすことも十分に考えられる。
ゲームでもたまにオーバーフローという現象が発生する場合がたまに見られ、これはデバッグの不足、あるいは想定を外れた(別の裏技やバグによって誘発されるものなど)結果が考えられる。これらの挙動は基本的にプレイヤーにとってはあまり良い結果にならないことが多い。
「アンダーフロー」と「負のオーバーフロー」
「オーバーフロー」に似た言葉に「アンダーフロー」というものがあり、しばしば数値が0未満になった時に値がマイナスから転じて多い数に変化することを指してアンダーフローと呼ばれてしまうことがあるが、その呼び方は実は間違いで、この場合「負のオーバーフロー」と呼ぶのが正しい( 結果が正の数でも負の数でも、桁数が上限を超えて溢れてしまうのがオーバーフローである )。
本来の「アンダーフロー」とは、浮動小数点演算で絶対値があまりに小さくなったとき、指数表現出来なくなる現象を指す。
分かりやすく言うと、0.00000000……001のような少数が下の桁数を丸められて0にされてしまうような現象である。単精度なら2の-129乗くらいで指数表現出来なくなり、0に丸められる。
これらの減少は絶対値の問題なので、値が正だろうが負だろうが関係ない。
オーバーフローの一例
特にゲームで見られるものを挙げる。ほかにも有名なものも存在するが、基本的に裏技や仕様、バグなどを使用することにより発生することが多い。
スーパーマリオブラザーズ
このゲームは無限増殖が可能であるが、残機の数値が符号有りの8ビットで保有されるため、128を超えると負の数となりゲームオーバーとなる。ただし一部ではカンストする設定も存在する。
FINAL FANTASY Ⅵ
魔力が高すぎる状態でアルテマなどの高威力の魔法を使うとダメージが極端に低くなる現象が起きる。ファイナルファンタジーシリーズではダメージは9999(一部例外有り)でカンストするが、内部ではしっかりとダメージ計算が行われているため一定ダメージを超えた時点でオーバーフローを起こすようである。リメイク版では修正されている。
ドラゴンクエストⅣ
カジノにおけるメダルの購入。詳細は延べないが大量購入すると異様な低額で購入可能となる場合がある。この裏技はファミリーコンピュータ版のみの仕様であり、数少ないユーザー有利のオーバーフローである。
ラ・ピュセル
アイテムのパラメータを強化して32767を超えると-32768になりパラメータがマイナスになる。32768というのが符号有り2進数の2バイトで表そうとすると-32768となる数値であるため起こる現象である。逆に-32768より低くした場合は32767になると思われる。リメイク版では修正されている。