2進乗算中のキャリーフラグとオーバーフローフラグの違いは何ですか?


ベストアンサー

最初に、これらの点を強調する必要があります。

  • ALUは、符号付きまたは符号なしの数学を行っているかどうかを気にしません。
  • ALUはバイナリを行うだけです。計算し、フラグを適切に設定します。
  • signed numbers 符号ビットは、数値の符号を示すビットであり、最上位ビットにあります。

符号なし演算では、エラーを検出するためにキャリーフラグを監視する必要があります。

符号付き演算では、エラーを検出するためにオーバーフローフラグを監視する必要があります。

キャリーフラグは次の場合に設定されます:

  • 2つの数値を加算すると、最上位(左端)のビットが実行されます。 d。
  • 1111 + 0001 = 0000 =>キャリーフラグがオンになっています。
  • 2つの数値を減算するには、最上位(左端)に借用する必要があります。 )ビットが減算されます。
  • 0000 - 0001 = 1111 =>キャリーフラグがオンになります。

オーバーフローフラグは、次の場合に設定されます。

  • 符号ビットoffを含む2つの数値の合計が結果をもたらす符号ビットが付いた番号on
  • 0100 + 0100 = 1000 =>オーバーフローフラグがオンになっています。
  • 符号ビットonを持つ2つの数値の合計は、符号ビットoffを持つ結果番号を生成します。
  • 1000 + 1000 = 0000 =>オーバーフローフラグがオンになっています。
  • 注意:混合符号加算によってオーバーフローフラグがオンになることはありません。

-わかりやすくするために、次の2つの例を見てみましょう。

1-次のバイナリ加算 `0111+ 0010 = 1001 `

-符号なし数学を行っている場合

0111 + 0010 = 1001 // overflow flag is turned on.

7 + 2 = 9 // its ok, we only care about the carry flag

-署名された数学を行っている場合

0111 + 0010 = 1001 // overflow flag is turned on.

7 + 2 = -7 // error detected

2-次のバイナリ加算を想定します `1111 + 0001 = 0000`

-符号なし数学を行う場合

1111 + 0001 = 0000 // carry flag is turned on.

15 + 1 = 0 // error detected

-署名された数学を行っている場合

1111 + 0001 = 0000 // carry flag is turned on.

-1 + 1 = 0 // its ok we only care about the overflow flag

// remember: Mixed-sign addition never turns on the overflow flag.

最後に、ここで詳細情報を見つけることができます: http://teaching.idallen.com/dat2343/10f/notes/040\_overflow.txt

回答

メカニズムの観点から、キャリーフラグは最上位ビットのキャリーアウトがあるときに設定されます。オーバーフローフラグは、最上位ビットへのキャリーがある場合に設定されます。

符号なし演算では、キャリーについてのみ心配する必要があります。国旗。最上位ビットから何かが実行された場合、結果は大きすぎて単一のレジスタに含めることができません。

符号付き演算の場合、状況はより複雑になります。キャリーフラグとオーバーフローフラグが異なる場合、オーバーフローが発生します。 2ビットで加算するためのすべての選択肢は次のとおりです。

00 + 00 = 00, (0 + 0 = 0 decimal), CF = 0, OF = 0

01 + 01 = 10, (1 + 1 = -2 decimal) CF = 0, OF = 1 overflow

01 + 10 = 11, ( 1 + -2 = -1 decimal), CF = 0, OF = 0

01 + 11 = 00, ( 1 + -1 = 0 decimal), CF = 1, OF = 1

10 + 10 = 00, ( -2 + -2 = 0 decimal), CF = 1, OF = 0 overflow

10 + 11 = 01, ( -2 + -1 = 1 decimal), CF = 1, OF = 0 overflow

11 + 11 = 10, (-1 + -1 = -2 decimal), CF = 1, OF = 1

2、5、6行目はオーバーフローが原因で誤った結果を生成することに注意してください。また、CFがOFと異なる場合も同様です。

一部のプロセッサがその比較を行う場合があり、表示されるOFは内部キャリーインフラグとキャリー(アウト)フラグを比較した結果。引き続き符号付き算術に対してのみ有効です。

乗算を含む他の算術でも機能します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です