プロが教えるわが家の防犯対策術!

2進数の減算のオーバーフロー/アンダーフロー

2進数の加減算においてどういうときにオーバーフローするのかわかりません。
例えば、
符号付き整数加算として、
1111+0001=10000
となり、4ビットで表現しきれないので、この場合オーバーフローということでしょうか?

基本的に、元々のビット列の長さ(この場合、4ビット)を演算後、超えてしまう
結果となった場合、オーバーフロー、アンダーフローが起きていると考えてしまって
よいのでしょうか?

10進数に変換して10進数の演算結果と異なることが分かれば、オーバーフローが
起きているといえるのでしょうが、ビット長が100ビットなど多ビット長の場合に
そのようなことはできないので、簡単なオーバーフロー、アンダーフローの見分け方が
知りたいです。

ご回答お願い致します。

A 回答 (2件)

ハードウェアでは


・符号なしオーバーフロー: 最上位からのキャリー/ボローがあればオーバーフロー
・符号付きオーバーフロー: 最上位からのキャリー/ボローと結果の最上位が同じならオーバーフロー
で判定できる. たとえば符号付きの
1111 + 0001 = 10000
の場合, 「最上位からのキャリー」が 1 で「結果の最上位」は (4ビットなので) 0 だからオーバーフローしていない.
演算回路をハードウェアレベルで構成するような本なら書いてあるんじゃないかな.
    • good
    • 1
この回答へのお礼

理解しました。
ありがとうございます。

お礼日時:2010/10/27 17:26

「得られた結果をもとのビット数になおした」ときに, 本来の演算結果と違う答えになるというのがオーバーフロー (アンダーフロー) です.


1111 + 0001 = 10000
という式では
・符号なしなら得られた結果は 4ビットにすると 0000 となり, これは本来の結果とは異なるのでオーバーフロー.
・符号付きのときには得られた結果は同じく 0000 となるが, これは本来の結果と一致するのでオーバーフローではない.
となります.
だから符号なしの場合のオーバーフローフラグ (普通はオーバーフローじゃなくてキャリー/ボローだけど) と符号付きのオーバーフローフラグが別々に存在する.

この回答への補足

>・・・ 0000 となるが, これは「本来の結果」と一致するので・・・
この「本来の結果」というのは、1111(2)→-1(10)、0001(2)→1(10)と10進数に変換した後、-1+1=0なので、0000と一致していればオーバーフローが起きていないという解釈だと思うのですが、わざわざ10進数に変換して確認しないと判断できないのでしょうか?

補足日時:2010/10/27 05:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!