算術オーバーフロー

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

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

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

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

符号付き表現の、特に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には一般にそのような場合を検出する方法があり(ステータスレジスタ参照)、レジスタより大きな数の演算をサポートできるようになっている。
伝播
格納できる範囲を超えた値の場合、オーバーフローであることを示す特別な値を格納しておき、その後の演算に伝播させていく。長い計算の最後に値をチェックすればオーバフローが発生したことがわかるので、このような扱い方が便利な場合もある。特にFPUによる浮動小数点数の演算でよく使われる。
無視
最もよくある手法。しかし、結果が不正になるだけでなく、セキュリティホールの原因となることもある。

その他[編集]

  • 無限大のある浮動小数点演算では、ゼロ除算は算術オーバーフローとはならない、と考える者がいるようだが誤りである。オーバーフローの結果として、答えが無限大になるのである。
  • 1996年にあったアリアン5の事故は、オーバーフローを適切に扱っていなかったことが原因である[1]

脚注[編集]

  1. ^ 失敗百選-アリアン5型ロケット爆発事故

関連項目[編集]