算術オーバーフロー

算術オーバーフロー（さんじゅつオーバーフロー、）あるいは単にオーバーフローは、デジタルコンピュータにおいて、演算結果がレジスタの表せる範囲や記憶装置上の格納域に記録できる範囲を超えてしまう現象、またはその結果レジスタ等に格納される値を意味する。オーバーフローは、本来演算結果を格納する場所とは違う場所に格納される場合がある。溢れとも言う。

符号無し表現の加減算では、最上位桁より上の桁（存在しない桁）への繰り上がり（キャリー）や、おなじく存在しない桁からの繰り下がり（ボロー）が起きることが溢れである。フラグに保存され、キャリーフラグという名が付けられていることが多い。

加算器で2の補数を使って減算を行って（加算器#減算器）いて、加算器のキャリー入出力をそのままとしている場合、繰り下がり（ボロー）のなかった場合にフラグが立ち、繰り下がりがあった場合にはフラグが立たない、というロジックになる（6502・POWER・ARM・PICなど）。

符号付き表現の、特に2の補数表現では、加減算のビット操作は符号無し表現のそれと全く同じであるが、最上位桁より上の桁との繰り上がりや繰り下がりではなく、最上位桁への繰り上がりや繰り下がりが溢れであることがある。最上位桁への繰り上がりや繰り下がりと同時に最上位桁より上の桁への繰り上がりや繰り下がりがあったら溢れではない。これのフラグはオーバーフローフラグという名が付けられていることが多い。

3ビットで+1をくりかえした場合でそれぞれの例を示す。

 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 →（X）→ 0 ...
 0 → 1 → 2 → 3 →（Y）→ -4 → -3 → -2 → -1 →（YX）→ 0 ...

（（X）と（YX）で最上位桁より上の桁への繰り上がりが起きている。（Y）と（YX）では最上位桁への繰り上がりが起きている）

浮動小数点数では、演算の結果、指数部が最大より大きくなった場合がオーバーフローで、結果が＋∞あるいは－∞になる。

オーバーフローの処理方法 
オーバーフローの処理方法はいくつかある。
 設計時の配慮
 正しいデータ型（大きさと符号の有無）を選択する。
 発生を未然に防ぐ
 演算を注意深く並べ、必要に応じてオペランドをチェックする。それによって演算結果がオーバフローとならないようにできる。
 発生時の処理
 オーバフロー発生時にその場で処理をする。例えば、2バイトの数値を1バイト毎の加算で加算する場合、まず下の桁（バイト）を加算して次に上の桁を加算する。このとき下の桁の加算でキャリーが発生した場合、上の桁の加算にキャリーのぶんも加算しなければならない。CPUには一般にそのような場合を検出する方法があり（ステータスレジスタ参照）、レジスタより大きな数の演算をサポートできるようになっている。例えば、Intel 8086の場合、オーバーフロー検知用のを実行することでオーバーフローフラグをチェックし、セットされている場合には、オーバーフロー例外を発生する。
 伝播
 格納できる範囲を超えた値の場合、オーバーフローであることを示す特別な値を格納しておき、その後の演算に伝播させていく。長い計算の最後に値をチェックすればオーバフローが発生したことがわかるので、このような扱い方が便利な場合もある。特にFPUによる浮動小数点数の演算でよく使われる。
 無視
 最もよくある手法。しかし、結果が不正になるだけでなく、セキュリティホールの原因となることもある。

その他 
 1996年にあったアリアン5の事故は、オーバーフローを適切に扱っていなかったことが原因である。
 電卓の画面は一般的に十進数で表示されるが、電卓でも計算の結果オーバーフローが発生する場合がある（8桁電卓の99999999＋1など）。これについての詳細は電卓#エラー表示についてを参照。

脚注

関連項目 
 IEEE 754

コンピュータの算術
数学に関する記事