補数とは、 ある数
(A) に加えると、 和の桁がひとつ上がる最小の数のことです。
下の図にはある数
(A) が 2 進数と 10 進数で表示されており、
それに 「補数」 が加えられて、 和が A より一桁多い最小の数になっています。
2 進数で表示した A は 8 桁で、 補数を加えると 9 桁のいちばん小さい数字、
100000000 になっていますし、
同じ A を 10 進数で表示すると 3 桁となり、 補数を加えると、 その和は 4 桁でいちばん小さい数字、
1000 です。
この場合、 2 進数の補数を 「2 の補数」、 10 進数の補数を 「10 の補数」 ともいいます。
また、 N進数のある数
(A) に加えると、和の桁が上がらない最大の数を
「N-1 の補数」 といいます。
2 進数の 「N-1 の補数」 は 1 の補数で、 「1 の補数」 のボタンをクリックすると、
A と 1 の補数の和は 8 桁の 2 進数でいちばん大きい数字、
11111111 になります。
10 進数の場合、 A に 「9 の補数」 を加えると、
その和は 3 桁でいちばん大きい数字、
999 です。
上図の A (2進数) の、 背景色が少し濃くなっている部分をクリックすると、 2進数の数値を編集できます。
A の値がどう変わっても、 補数がそれに応じて自動的に変わるようになっています。
ある数値 A に補数を加えたのですから、 逆にある数値 A の補数を求めるには、 引き算をすればいいことになります。
下図の場合、 2の補数なら
100000000 から、
10の補数なら
1000 から A を引きます。
もちろん、1の補数は
11111111 から、
9の補数は
999 から引きます。
上図の A (2進数) も、 背景色の濃い部分をマウスでクリックすれば、 2進数の数値を編集できます。
補数を使えば、 減算を 「加算」 で行うことができます。
下の図では 2進数 A と B で、左では "引き算" で計算していますが、
右では B の 2 の補数を加えています。
和の最上位桁を無視すれば、どちらも同じ結果になっていることが分かります。
ここでも 背景色の濃い部分をマウスでクリックすれば、 A も B も数値を編集できます。
(ただし A ≦ B、 あるいは B=0 となるような編集はできません。)
なぜ同じになるのでしょうか?
一見、不思議に思えますが、考えてみればバカバカしいほど当たり前です。
いま、 A は 11111111、 B は 10000001 だとします。
このとき、 B の 2の補数は 1111111 です。
2の補数はどうして計算したかというと、 100000000 から B を引いたのです。
B の 2の補数 = 100000000 − 10000001 = 1111111
上の右側の計算では、A にこれを加えたのですから、
11111111 + (100000000 − 10000001) = 101111110
という計算をしたことになります。
和の最上位桁を無視すれば、
減算と同じ結果が得られるのは当然です
。
ではなぜ、わざわざ 2の補数を使うのでしょうか?
それは、2進数の補数は簡単に作れるからです。
10進数の補数を作るには、本当に "引き算" をしなくてはなりませんが、
2進数の 1の補数は引き算をしなくても、もとの数の 1 と 0 を反転するだけですみます。
10000001 の 1の補数は 01111110 です。
これに 1 を加えれば 2の補数、 01111111 になります。
電子回路 (コンピュータ) にとって、 0 と 1 を反転させるのは朝飯前です。
NOT 回路 を
桁の数だけ並べるだけです
。
こうしてできた 1の補数を レジスタ に入れておいて、
ひとつカウントアップすれば 1 を加えたのと同じになります。
レジスタはもともと、コンピュータの中にはたくさんあります。
加算回路に少し手を加えるだけで、 減算もできるようになるからです。