6

ABが符号付きの正の整数であると仮定すると、 についてはの補数をA-B使用して計算されます。A+2B

たとえば、4 ビットのバイナリ システムでは、符号付き整数の場合 7-3=0111-0011=0111+1101=(1)0100、括弧内の 1 がキャリー ビットです。符号付き整数のオーバーフロー規則によれば、オーバーフローがないことがわかっているため、結果は正しいです。

しかし、符号なし整数の場合、 を計算するとどうなるでしょう7-3か? 上記と同じ方法を使用すると、次のようになります。

7-3=0111-0011=0111+1101=(1)0100

次に、符号なし整数のオーバーフロー規則に従って、キャリーアウトによるオーバーフローが発生します。つまり0100、オーバーフローがあるので間違っています。0100しかし実際には、結果が正しいことはわかっています。

私の分析が正しければ、加算器を使用して符号なし整数減算を実行するのは間違っていませんか?

4

4 に答える 4

5

あなたの分析は正しくありません。実際には CPU ALU ユニットに依存します。:)

最初のケースでは、4 ビット整数を使用していますが、4 ビット符号整数の最上位ビットが sign であることを忘れていまし。したがって、キャリーとオーバーフローのステータスのみをチェックしており、のステータス ビットもチェックしていません。

一般に、バイナリ算術演算では、符号付き整数と符号なし整数のaddsubは同じです。影響を受けるフラグのみが異なります。

実際には、次のことを考慮する必要があります。

  • 符号付き整数演算でのキャリーオーバーフロー、およびのフラグ。
  • 符号なし整数演算のみキャリーフラグ。

詳細説明:

補数関数のマイニングは否定なので、正から正、負から負の反対の数を取得します。2 つの方法で 2 進補数を作成できます。番号 3 の両方のケースを見てみましょう。

  1. 符号なし演算時は compl(3) = b'0011' xor b'1111' + b'0001' = b'1101' +キャリー(キャリーはcompl(0) 時のみ設定)
  2. 符号付き算術数値は準拠 (3) = b'10000' - b'0011' = b'1101' b'0000' - b'0011' = b'1101' +キャリー(キャリーはcompl でのみクリアされます) (0))

最初のケースでは、関数補数もキャリー ビットを補い、さらに、ボローという名前のキャリー フラグの 2 番目の解釈があります。

2番目のケースでは、すべてが明確です。補数でキャリー (オーバーフロー) がある場合は、減算の結果を正規化するために別のオーバーフローが必要であることを意味します。

于 2011-11-08T16:20:29.637 に答える
4

関連する質問に対するこの回答には、加算による減算を行う方法を示す C のサンプル コードがあります。このコードは、キャリー フラグとオーバーフロー フラグも設定し、いくつかの数値を加算および減算して結果を出力する単純な「テスト」を含んでいます。数値は 8 ビットです。

編集:符号なし整数にSUBの代わりに ADD を使用し、SUBからのように符号なしオーバーフロー/アンダーフローを検出できるという正式な証明。

ここa - bで、abは 4 ビットの符号なし整数であり、加算によって減算を実行し、a < b のときに 4 ビットの差とアンダーフロー/オーバーフローの指標を取得したいとします。

a - b = a + (-b)
モジュロ 16 演算で操作しているため、-b= 16-b. したがって、
a - b = a + (-b) = a + (16 - b)

通常の符号なし加算を実行するa16-b、この加算のオーバーフロー条件 (CPU のcarryフラグで示されることが多い) は次のようになります (4 ビット整数を扱っていることを思い出してください)。

a + (16 - b) > 15
このオーバーフロー条件を単純化しましょう:
a + 16 - b > 15
a + 16 > 15 + b
a + 1 > b
a > b - 1

整数を扱っていることを思い出してください。したがって、上記は
a >= b のように書き換えることができます。と を加算し
てキャリーフラグ=1になる条件です。不等式が成り立たない場合は、キャリー = 0 になります。a(16)-b

ここで、減算 (a - b) からのオーバーフロー/アンダーフローに関心があったことを思い出してください。その条件はa < bです。

まあ、a >= bはa < bの正反対です。

このことから、加算によってcarry得られるフラグは、減算オーバーフローの逆、つまり、適切な減算命令 (例: SUB) を使用して直接減算することによって得られるフラグのであるということになります。a(16)-bborrowba

キャリーを逆にするか、逆に扱うだけです。

于 2011-11-09T08:12:10.273 に答える
0

これは少しわかりにくいですが...これを行った場所にVHDLがありました。符号なしのメモリ位置と符号付きのオフセット値を持つ CPU がありました。

architecture Behavioral of adder16 is
signal temp: std_logic_vector (16 downto 0);
begin
eval: process(vectA,vectB,temp)
begin
temp <=(('0'& vectB)  + (vectA(15) & vectA));
output <= temp( 15 downto 0);
end process;
end Behavioral;
于 2011-11-08T15:50:07.720 に答える