戻る 補数  (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 の補数を求めるには、 引き算をすればいいことになります。
下図の場合、 2の補数なら 100000000 から、 10の補数なら 1000 から引きます。
もちろん、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 を加えたのと同じになります。
レジスタはもともと、コンピュータの中にはたくさんあります。

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




情報処理概論 に戻る   目次 に戻る  戻る

*1 10進数の場合も同様で、 11111111 と 10000001 は 10進数ではそれぞれ 255 と 129 ですが、 129 の 10の補数は 871 です。
255 + 871 = 255 +(1000 − 129)= 1126 なので、 最上位の 1 を無視すれば同じ結果が得られます。
*2 もともとコンピュータには NOT 演算が必要ですから、 わざわざ追加する必要はありません。

Java applet 圧縮アーカイブファイル    自由利用マーク
2007.07.27  address