1. ホーム
  2. binary

[解決済み】符号付き数値の符号と倍数より2の補数を好むのはなぜですか?

2022-04-07 23:21:37

質問

2進数で-1を表現するために、ビットを反転して1を足すという2の補数を使っているのは、何か理由があるのでしょうか?

-1は11111111(2の補数)で表され、10000001は最初のビットをネガティブフラグとする2進数の1である。

免責事項:私は仕事上、二進法に頼っているわけではありません。

解き方は?

これは、加算が負の数を扱うための特別なロジックを持つ必要がないようにするためです。調べる ウィキペディアの記事 .

2と-1という2つの数字があるとします。 あなたの直感的な数字の表現方法では、これらは 00101001 それぞれ、4ビットにこだわっています)。で、その 2の補数 の方法で、それらは 00101111 . では、それらを追加するとしよう。

2の補数による加算は非常にシンプルです。普通に数字を足していき、最後にキャリービットがあれば捨てます。だから、次のように足し算をする。

  0010
+ 1111
=10001
= 0001 (discard the carry)

0001 は1であり、これは"2+(-1)"の期待される結果です。

しかし、あなたの直感的な方法では、足し算はもっと複雑です。

  0010
+ 1001
= 1011

どっちが-3でしょう?この場合、単純な足し算は通用しないんだ。片方の数字がマイナスであることに注意し、その場合は別のアルゴリズムを使う必要があります。

このquot;intuitive"な保存方法の場合、引き算は足し算とは異なる操作で、加算する前に数値のチェックを追加する必要があるのです。最も基本的な操作(足し算、引き算など)はできるだけ高速に行いたいので、できるだけ単純なアルゴリズムを使えるような方法で数値を保存する必要があります。

さらに、quot;intuitive"記憶法では、0が2つある。

0000  "zero"
1000  "negative zero"

直感的には同じ数字ですが、保存時には2つの異なる値を持つことになります。すべてのアプリケーションは、ゼロでない値が負のゼロでもないことを確認するために、特別なステップを踏む必要があります。

それは、値を格納するレジスタの幅を拡張する必要がある場合です。2の補数では、4ビットの数値を8ビットのレジスタに格納する場合、最上位ビットを繰り返すだけでよいのです。

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

小さい方の単語の符号ビットを見て、大きい方の単語の幅を埋めるまで繰り返せばいいのです。

あなたの方法では、既存のビットをクリアする必要があり、パディングに加えて余分な操作が必要です。

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

どちらの場合も4ビットを設定する必要がありますが、quot;intuitive"の場合は5ビット目もクリアする必要があります。これは、すべてのアプリケーションに存在する最も基本的で一般的な操作の1つで、小さな追加ステップです。