補数
補数
ここでは、計算機内部での演算に使用される補数について解説する。
補数を利用する目的は、負数の表現を明確にし、同時に加減算を簡単にすることにある。
もともと、補数とは「足すと、桁が繰り上がる最小の自然数」のことだ。
たとえば、8に2を足すと、桁が繰り上がり10になる。
8にとって、2が補数であり、2の補数が8なのだ。
1〜9の範囲で言えば、足して10になる数が補数となる。
このような補数を特に「10の補数」という。
これに対して「9の補数」もある。
「足しても、桁が繰り上がらない最大の自然数」だ。
この場合、8にとって、1が補数であり、1の補数が8なのだ。
元の数 | 10の補数 足すと、桁が繰り上がる最小の自然数 |
9の補数 足しても、桁が繰り上がらない最大の自然数 |
1 | 9 | 8 |
2 | 8 | 7 |
3 | 7 | 6 |
4 | 6 | 5 |
5 | 5 | 4 |
6 | 4 | 3 |
7 | 3 | 2 |
8 | 2 | 1 |
9 | 1 | 0(本当は「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)すべてが数値と解釈 | 一番左側の桁は符号と解釈 |
00000000 | 0 | 0 |
00000001 | 1 | +1 |
00000010 | 2 | +2 |
00000011 | 3 | +3 |
・・・ | ・・・ | ・・・ |
01111101 | 125 | +125 |
01111110 | 126 | +126 |
01111111 | 127 | +127 |
10000000 | 128 | -127 |
10000001 | 129 | -126 |
10000010 | 130 | -125 |
10000011 | 131 | -124 |
・・・ | ・・・ | ・・・ |
11111110 | 254 | -1 |
11111111 | 255 | 0 |
この表を見ると、10進数の符号を反転させると、対応する2進数は「0と1が反転する」ことが確認できる。
10進数 | 2進数(1の補数) |
+125 | 01111101 |
-125 | 10000010 |
2進数の補数には「1の補数」と「2の補数」があった。
そこで、「1の補数による表現」と「2の補数による表現」を比較すると下表のようになる。
2進数 | 1の補数で表現 | 2の補数で表現 |
00000000 | 0 | 0 |
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 |
11111111 | 0 | -1 |
両者を比べると、「1の補数による表現」には、大きな欠点があることが確認できる。
それは、「0」の表現が「00000000」と「11111111」の二通りあるということだ。
これに対し、「2の補数で表現」では「0」は重複しない。
「+125」と「-125」を加算すれば、「0」になる。
当然、2進数でも符号を反転させたものを加算すれば「0」でなくてはならない。
10進数 | 2進数(2の補数) |
+125 | 01111101 |
-125 | 10000011 |
「01111101」と「10000011」を足し合わせると「100000000」となる。
下8桁のみ見れば「00000000」となり、キチンとルールにのっとっていることが確認できる。
このため、コンピュータ内部で扱う二進数表記では、「2の補数」が利用されているのだ。
これを利用するとさらにメリットもある。
「引く」という論理操作は「負数を足す」という論理操作で代用できる。
つまり、「引く」と「足す」の二つのロジックをそれぞれ用意する必要がなくなるのだ。
■次のページ:ブール代数
スポンサーリンク
2006/07/01