2の補数表現

logic

2の補数表現とは

2の補数は、論理回路の数値演算で負の数を表す方法の一つです。2の補数表現を用いると、2つの数値の加減算を加算回路だけで行うことができます。2の補数表現で負の数を扱う方法は、3-2を計算するときに、3から2を引くと考えるのではなく、3に-2を足すと考えることに似ています。

$$ 3_{10} – 2_{10} = 3_{10} + (-2_{10}) $$

2の補数表現の具体的な例として、3ビットの数を考えます。3ビットで表現できる数の種類は8通り\( 2^3=8 \)です。表1は、3ビットの2進数と2の補数との対応表です。2の補数表現を用いない場合、3ビットで表せる数の範囲は10進数で0から7ですが、2の補数表現では10進数で-4から3の範囲の数を扱うことができます。

表1: 3ビットの数の表現
2進数000001010011100101110111
10進数01234567
10進数(2の補数表現)0123-4-3-2-1

2の補数表現では正の数と負の数に半分ずつ範囲を割り当てます。その結果、2の補数表現を使用しない場合に比べて、正の数で表現できる範囲は半分になります。正確には、0は1つしかない(プラス0とマイナス0の2つの0がある訳ではない)ので負の数が1つ多くなります。2の補数表現の数が正か負かは、最上位ビットが0か1かで判別できます。最上位ビットが0のときは正での数、最上位ビットが1のときは負の数です。また、図1を見ればわかるように、ある2進数の数を見ただけでは、その数が2の補数表現かそうではないのかは判別できません。数値自体とは別に、数を扱う取り決め(2の補数として扱うかどうか)の仕様などが必要になります。

2の補数への変換

2の補数ではない数を2の補数に変換するには、元の数の全ビットを反転させて1を加算します。具体例として、3ビットの数\(3_{10} = 011_{2}\)の2の補数\(-3_{10}\)を求めます。

1. 元の数の全ビットを反転する

$$3_{10} = 011_{2}の全ビットの反転: 100_{2}$$

2. 1を足す

$$100_{2} + 001_{2} = 101_{2}$$ \(3_{10} = 011_{2}\)の2の補数表現は、\(101_{2}=-3_{10}\)ということがわかります。この変換が正しいかどうかは、元の数と変換後の数を足して0になるかどうかで確認できます。 $$ 3_{10} + -3_{10} = 011_{2} + 101_{2} = 000_{2} = 0_{10}$$ このように、結果が0になるので、2の補数は\(101_{2}\)で正しいことがわかります。 2の補数表現で重要なのは、数を表すビット数です。\( 011_{2} \)と\( 101_{2} \)を足して4ビットで表すと、桁上がりが発生して\( 1000_{2}= 8_{10}\)になりますが、この例では数は3ビットと決めているので4ビット目は無視する必要があります。3ビットの加算回路で演算する場合は、桁上がりキャリー信号を無視します。
タイトルとURLをコピーしました