9

David Malan ( here ) によるバイナリについてのすばらしい講義を見ています。彼は、符号付き/符号なし、1 の補数、および 2 の補数表現について話しました。次のように並んだ 4 + (-3) の追加が行われました。

0100
1101 (flip 0011 to 1100, then add "1" to the end)
----
0001

しかし、彼は魔法の手を振って、最後のキャリーを投げ捨てました。私はいくつかのウィキペディアの調査を行いましたが、それがよくわかりませんでした.誰かがその特定のキャリー(8の-> 16の列で)がドロップされた理由を説明できますが、彼はその直前のものを保持しましたか?

ありがとう!

4

10 に答える 10

11

最後のキャリーは、ターゲット スペースに収まらないため、ドロップされました。5番目のビットになります。

彼が同じ追加を実行した場合、たとえば 8 ビットのストレージを使用すると、次のようになります。

00000100
11111101
--------
00000001

この状況では、「未使用」のキャリーが残ってしまいます。

2 の補数を使用した加算を適切に機能させるには、キャリーをこのように処理する必要がありますが、これはストレージが限られている場合にキャリーを処理する最も簡単な方法であるため、これで十分です。とにかく、正しい結果が得られます:)


x86 プロセッサは、このような追加のキャリーをキャリー フラグ (CF) に格納します。これは、特定の命令でテストすることができます。

于 2009-11-02T21:01:54.440 に答える
4

キャリーはオーバーフローと同じではありません

この例では、MSBを実行しています。定義上、このキャリーは床に落ちます。(それが行く場所があれば、それはMSBの外になかったでしょう。)

ただし、符号の異なる2つの数値を加算してもオーバーフローすることはありません。オーバーフローは、同じ符号の2つの数値が異なる符号の結果を生成する場合にのみ発生する可能性があります。

于 2009-11-02T21:09:01.610 に答える
3

数字の位置を追加して左辺を拡張すると、キャリーが左に向かって無数のビット位置にロールオーバーすることがわかります。そのため、最終的なキャリーが実際には 1 になることはありません。したがって、答えは正です。 .

 ...000100
+...111101
----------
....000001
于 2009-11-02T21:02:07.543 に答える
2

ある時点で、数値を表すビット数を設定する必要があります。彼は 4 ビットを選択しました。5 番目のビットへのキャリーはすべて失われます。しかし、彼は数値を 4 ビットだけで表すことにしたので、それで問題ありません。

数値を表すために 5 ビットを使用することに決めた場合、同じ結果が得られます。

于 2009-11-02T21:01:18.163 に答える
2

それはそれの美しさです.結果は、追加する用語と同じサイズになります。そのため、5 番目のビットが破棄されます

2 の補数では、キャリー ビットを使用して、最後の操作でオーバーフローが発生したかどうかを通知します。

オーバーフローがあったかどうかを確認するには、最後の 2 つのキャリー ビットを調べる必要があります。あなたの例では、最後の 2 つのキャリー ビットは11、オーバーフローがないことを意味していました。

最後の 2 つのキャリー ビットが11または00の場合、オーバーフローは発生していません。最後の 2 つのキャリー ビットが10またはの場合、01オーバーフローが発生しています。そのため、キャリー ビットを気にすることもあれば、無視することもありました。

下の最初の行はキャリー行です。この行の左端のビットは、オーバーフローがあったかどうかを判断するために使用されます。

1100
 0100
 1101
 ----
 0001
于 2009-11-02T21:02:07.200 に答える
1

2 の補数の加算を実行する場合、キャリーが問題を示すのは、オーバーフロー状態が発生した場合のみです。これは、2 つのオペランドの符号が異なる場合には発生しません。

それらが同じ符号を持っている場合、オーバーフロー条件は符号ビットが 2 つのオペランドから変化したときです。つまり、最上位ビットへのキャリーがあります。

私のコンピューター アーキテクチャの学習を思い出すと、これは、最上位ビットへのキャリーが最上位ビットからのキャリー アウトと異なる場合に設定されるフラグによって、ハードウェア レベルで検出されることがよくあります。あなたの例ではそうではありません(msbへのキャリーとmsbからのキャリーがあります)。

それを単純に考えると、「サインは変わらない」ということです。MSB へのキャリーがキャリーアウトと異なる場合は、符号が不適切に変更されています。

于 2009-11-02T21:04:46.493 に答える
1

4 ビットしか使用していないように見えるため、16 の列はありません。

4 ビット以上を使用している場合、-3 の表現は異なり、数学のキャリーは最後に捨てられます。たとえば、6 ビットの場合は次のようになります。

 000100
 111101
 ------
1000001

キャリーは表現のビット範囲外にあるため、それはなくなり、あなただけが持っています000001

于 2009-11-02T21:02:14.157 に答える
1

25 + 15 を考えてみましょう:

5+5 = 10、0 を保持し、1 を 10 の桁に移動させます。次に、2 + 1 (+ 1) = 4 です。したがって、結果は 40 です :)

バイナリでも同じです。0 + 1 = 1, 0 + 0 = 0, 1 + 1 = 10 => 1 を 8 列に送信, 0 + 1 ( + 1 ) = 10 => 1 を次の列に送信 - これがオーバーフローです。なぜ1を捨てるだけなのか。

これが、2 の補数が優れている理由です。符号ビットが MSB であるという事実を (ab) 使用するため、base-10 の場合と同じように加算/減算を行うことができます。

私が自分自身を理解したことを願っています。英語が母国語でない場合、これを説明するのは非常に困難です:)

于 2009-11-02T21:02:33.620 に答える
0

あなたは4ビット表現について話しているからです。実際のマシンと比べると珍しいことですが、コンピューターの各バイトが 4 ビットであると仮定すると、次のような特性があります。1 バイトは 15 から -15 で折り返されます。その範囲外のものは保存できません。それに、とにかく、符号ビットを超えた余分な 5 番目のビットをどうしますか?

さて、それを考えると、日常の数学から4 + (-3) = 1、まさにあなたが得たものであることがわかります。

于 2009-11-02T21:02:56.233 に答える
0

キャリーはどうしようもないので捨てました。結果にとって重要な場合は、操作が結果に格納できる値の範囲をオーバーフローしたことを意味します。アセンブラーには、通常、結果の末尾を超えたキャリーをテストできる命令があり、そこで明示的に処理できます。たとえば、多倍精度値の次に高い部分にキャリーします。

于 2009-11-02T21:01:57.467 に答える