戻る   補数  (complement)



補数とは、 ある数 (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 を加えたのと同じになります。
レジスタはもともと、コンピュータの中にはたくさんあります。

加算回路に少し手を加えるだけで、 減算もできるようになるからです。