算術オーバーフロー

算術オーバーフローの最新ニュースをまとめて検索!

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

多くのコンピュータでは、オーバーフローを2種類に区別して扱う。加減算で繰り上げ(キャリー)や繰り下げ(ボロー)が発生して、結果として格納域に収まらなくなることがある。これは符号無し数値の加減算で発生し、キャリーフラグを見ればよい。それとは関係なく発生するオーバーフローは、オペランドの正負の符号からはあり得ない結果(の正負の符号)となる場合を指す(例えば、2つの正の数を加算して負の値になる場合など)。これは符号付き数値(2の補数表現)の加減算で発生し、オーバーフローフラグを見ればよい。

オーバーフローの処理方法はいくつかある。

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

ゼロ除算は算術オーバーフローとはならない。数学的には実数のゼロ除算は未定義である。つまり、値が大きすぎるのではなく、値が存在しない。

アリアン5ロケットの1996年の打ち上げ失敗は、算術オーバーフローを処理せずに放置したことが根本原因とされている。

[編集] 関連項目

  • IEEE 754
  • 整数オーバーフロー
  • 算術アンダーフロー
  • 無限大(浮動小数点数では、無限大は正しい値でありオーバーフローを意味しない。ただし、オーバーフローが発生した場合に値を無限大に置き換えることが多い)

最終更新 2009年9月23日 (水) 22:58 (日時は個人設定で未設定ならばUTC)。
【算術オーバーフロー】変更履歴

ご利用上の注意