物理学解体新書

補数

HOME情報科学>補数

補数

ここでは、計算機内部での演算に使用される補数について解説する。
補数を利用する目的は、負数の表現を明確にし、同時に加減算を簡単にすることにある。


もともと、補数とは「足すと、桁が繰り上がる最小の自然数」のことだ。
たとえば、8に2を足すと、桁が繰り上がり10になる。

8にとって、2が補数であり、2の補数が8なのだ。
1〜9の範囲で言えば、足して10になる数が補数となる。
このような補数を特に「10の補数」という。


これに対して「9の補数」もある。
「足しても、桁が繰り上がらない最大の自然数」だ。
この場合、8にとって、1が補数であり、1の補数が8なのだ。


元の数10の補数
足すと、桁が繰り上がる最小の自然数
9の補数
足しても、桁が繰り上がらない最大の自然数
198
287
376
465
554
643
732
821
910(本当は「0」は自然数でないが)


この表から確認できるように「10の補数」=「9の補数」+1の関係がある。
この原理が分かっていると、10進数の任意の整数の補数を求めることができる。


例えば「3784012」の9の補数は「6215987」となり、これに1を足した「6215988」が10の補数である。
(1は各桁に足すのではない)


この補数は2進数にも展開できる。
2進数の補数は「2の補数」と「1の補数」だ。
両者には「2の補数」=「1の補数」+1の関係がある。
2の補数は、各桁の「0」と「1」を単純に反転させればいい。
「1001101」の1の補数は「0110010」となり、これに1を足した「0110011」が2の補数である。


ところで、コンピュータの内部では、2進数が利用されている。
数値には正の数と負の数があり、これらを2進数でどのように表すかという問題がある。
結論を言えば「2の補数が負の数を表す」のだが、なぜそうなるのかを解説しよう。


8桁(8bit)の2進数を考えてみよう。
8桁(8bit)の2進数であれば「00000000」(0)から「11111111」(255)まで表現することができるのだ。
例えば、10進数の「6」は「00000110」となる。
では、「-6」はどのように表現するのだろうか?


一番左側の桁を、数値ではなく符号と決めるのだ。
一番左側の桁が「0」であれば「+(プラス)」、「1」であれば「-(マイナス)」と定義する。
こうすると、「-127」〜「+127」まで表現することができる。


2進数8桁(8bit)すべてが数値と解釈一番左側の桁は符号と解釈
0000000000
000000011+1
000000102+2
000000113+3
・・・・・・・・・
01111101125+125
01111110126+126
01111111127+127
10000000128-127
10000001129-126
10000010130-125
10000011131-124
・・・・・・・・・
11111110254-1
111111112550


この表を見ると、10進数の符号を反転させると、対応する2進数は「0と1が反転する」ことが確認できる。

10進数2進数(1の補数)
+12501111101
-12510000010


2進数の補数には「1の補数」と「2の補数」があった。
そこで、「1の補数による表現」と「2の補数による表現」を比較すると下表のようになる。


2進数1の補数で表現2の補数で表現
0000000000
00000001+1+1
00000010+2+2
00000011+3+3
・・・・・・・・・
01111101+125+125
01111110+126+126
01111111+127+127
10000000-127-128
10000001-126-127
10000010-125-126
10000011-124-125
・・・・・・・・・
11111110-1-2
111111110-1


両者を比べると、「1の補数による表現」には、大きな欠点があることが確認できる。
それは、「0」の表現が「00000000」と「11111111」の二通りあるということだ。
これに対し、「2の補数で表現」では「0」は重複しない。


「+125」と「-125」を加算すれば、「0」になる。
当然、2進数でも符号を反転させたものを加算すれば「0」でなくてはならない。

10進数2進数(2の補数)
+12501111101
-12510000011


「01111101」と「10000011」を足し合わせると「100000000」となる。
下8桁のみ見れば「00000000」となり、キチンとルールにのっとっていることが確認できる。


このため、コンピュータ内部で扱う二進数表記では、「2の補数」が利用されているのだ。
これを利用するとさらにメリットもある。
「引く」という論理操作は「負数を足す」という論理操作で代用できる。
つまり、「引く」と「足す」の二つのロジックをそれぞれ用意する必要がなくなるのだ。

■次のページ:ブール代数

このページのTOPへ



スポンサーリンク

2006/07/01



スポンサーリンク

Amazon.co.jpアソシエイト



スポンサーリンク

Amazon.co.jpアソシエイト