2

キャリー フラグ (CF) とオーバーフロー フラグ (OF) を理解するのに少し苦労しています。

ここに私が取り組んでいるいくつかのサンプル問題があります:

1.  1011 1111    2.  1111 0111    3.  0111 1110  -->   0111 1110
  + 1011 0111      + 1101 1101      - 1011 0000  --> + 0100 1111
  ___________      ___________      ___________      +         1
    0111 0110        1101 0100                       ___________
                                                       1100 1110
  1. 符号位置のキャリーアウトが1で、符号位置へのキャリーインが0なので、OF=1?
  2. 符号位置のキャリーアウトが1、符号位置へのキャリーインが1なので、OF=0?
  3. 符号位置のキャリーアウトが0で、符号位置へのキャリーインが1なので、OF=1?

符号なしオーバーフローと適切な CF 値を理解するのに苦労していると思います。

4

1 に答える 1

2

免責事項:私は専門家ではありません(または、このレベルのコードのユーザーでさえありません:))。

キャリー フラグは符号なしデータに対して意味があり、オーバーフロー フラグは符号付きデータに対して意味があると思います。

どちらも常に生成されますが、値を符号なしと見なすか、2 の補数と見なすかはユーザー次第です。そのため、どちらのフラグに注意を払うかはユーザー次第です。

出典: http://en.wikipedia.org/wiki/Overflow_flag

内部的には、オーバーフロー フラグは通常、符号ビットの内部キャリーの排他的 OR によって生成されます。符号ビットは、符号なしと見なされる数値の最上位ビットと同じであるため、オーバーフロー フラグは「無意味」であり、通常、そのような数値が加算または減算されると無視されます。

符号ビットは最上位ビット (最も左にあるビット) です。

排他的または (XOR) は次のとおりです。

  • どちらでもない場合: 0
  • いずれかの場合: 1
  • 両方の場合: 0

符号ビットへのキャリーインは、最上位から 2 番目のビットが追加されたときに、次の列に繰り越される値を生成する場合です。

キャリーアウトは、最上位ビット (数値が 2 の補数の場合は符号ビット) を加算するときにキャリーを実行する必要があるかどうかです。

これら 2 つの値を XOR すると、特定の加算後にオーバーフロー フラグの値が得られるはずです。

于 2011-09-22T04:40:18.390 に答える