web-dev-qa-db-ja.com

2の補数でオーバーフローはどのように検出されますか?

two's complementを使用して正と負の数を引くと、オーバーフローが発生することがわかります。たとえば、2から1を引くと、次のようになります。

2 = 0010
1 = 0001 -> -1 = 1111
2 + (-1) -> 0010 + 1111 = 10001

したがって、ここで結果には左から5番目のビット10001があります-オーバーフローですか? 2の補数で検出されたオーバーフローの次のルールを見つけました。

2つの正の数の合計が負の結果をもたらす場合、合計はオーバーフローしています。 2つの負の数の合計が正の結果をもたらす場合、合計はオーバーフローしています。それ以外の場合、合計はオーバーフローしていません。

誰かがこれらについて詳しく説明し、例を示すことができますか?

4
Maxim Koretskyi

タイトルの質問への回答から始めましょう。

2の補数でオーバーフローはどのように検出されますか?

オーバーフロールール:同じ符号(両方とも正または両方が負)の2つの数値が追加された場合、結果の符号が反対である場合にのみオーバーフローが発生します。

しかし、あなたはあなたの例の後にあなたの質問の本文で何か違うことを尋ねます。

したがって、ここで結果には左から5番目のビット10001があります-オーバーフローですか?

番号!ここにはオーバーフローはありません。その5番目のビットはキャリー/ボローです。あなたが足し算について話しているなら、運びなさい。あなたが引き算について話しているなら借りなさい。

オーバーフローは、表現しようとしている数値が表現できる数値の範囲外である場合に発生します。この例では、4ビットの2の補数を使用しています。つまり、-81000)から+70111)までの範囲の任意の数値を表すことができます。減算の結果2-1+1であり、表現の範囲内にある数値です。

負のオペランドと正のオペランドを追加すると、結果は常に表現の範囲内になります。同じ符号(両方とも正または両方が負)の2つの数値を加算すると、オーバーフローが発生し、結果の符号が逆になります。

キャリーアウトとオーバーフローに関する誤解のほとんどは、キャリーアウトをパラメータの1つとして使用してオーバーフローフラグを生成するという事実に起因しています。それらは強く関連していますが、同じものではありません。

2の補数で数値を加算するときに、キャリーアウトと最上位ビット(符号ビット)へのキャリーオンが異なる場合は、オーバーフローが発生したことを意味します。

正の結果を持つ2つの負のオペランドを見てみましょう。

-8 + (-1) = -9 

 1000  (carry)
  1000 (-8)
+ 1111 (-1)
------
  0111 (+7) OVERFLOW!

キャリーアウトは1で、キャリーオンからサインビット(MSB)は0です。

そして今、負の結果を持つ2つの正のオペランドの例。

+7 + 1 = +8

 0111  (carry)
  0111 (+7)
+ 0001 (+1)
------
  1000 (-8) OVERFLOW!

キャリーアウトは0で、キャリーオンからサインビット(MSB)は1です。

21
GabrielOshiro

@GabrielOshiroの答えは本当に良いです。ここにロジックを少し追加したいだけです。ここで2と-1を足すと、

2 = 0010
1 = 0001 -> -1 = 1111
2 + (-1) -> 0010 + 1111 = 10001

2の補数ではそのビットが負の値をもたらすため、負の数の最上位ビットを残りのビットから分離する必要があります。したがって、最初に他のすべてを最初に追加する場合:

0010 + 0111(leave out the leftmost 1 for now) = 1001

この後、「10001」の5番目のビットは、前に(4番目のビットで)残した「1」を1001に加算することによって発生し、5番目のビットにキャリーが発生することがはっきりとわかります。ただし、この「1」は実際には1001でキャンセルされるはずなので、0001のままにしておくと、ここでは「10001」の余分なビットを無視しても問題ありません。

この余分なビットを安全に無視できる場合と無視できない場合について、より詳細な推論を検討します。 @GabrielOshiroが述べたように、最も重要なものからのキャリーアウトとキャリーオンが異なる場合、それを無視することはできません。キャリーアウトでは、余分なビットを保持するスペースがないため、負の数の2単位が失われ、キャリーインでは、正の数の単位であると想定されるものが次のように考慮されるため、正の数の2単位が失われます。代わりに負の単位。ここで1-(-1)= 2です。したがって、キャリーオンとキャリーアウトは互いにキャンセルされます。ただし、そのうちの1つだけが発生すると、結果が不正確になるため、オーバーフローが発生します。

2
shengjiex98