補数を語る上で避けて通れないのが、「1の補数」と「2の補数」の違いです。この2つの関係を整理すると、2進数における負の数の表現がクリアに見えてきます。
手順は驚くほどシンプルです。ある2進数に対して、以下の2ステップを踏むだけで2の補数が完成します。
1. すべてのビットの「0」と「1」を入れ替える(ビット反転 = 1の補数)
2. 反転させた数値の最下位ビットに「1」を足す(加算 = 2の補数)
例えば、8ビット環境で「00000101(10進数の5)」の2の補数(つまり −5)を求めてみます。
・元の数値:00000101
・全ビット反転(1の補数):11111010
・末尾に1を加算(2の補数):11111011
この「11111011」が、コンピュータ内部における「−5」のデータ表現です。最上位ビット(一番左の桁)が「1」になっているのは、その数値がマイナスであることを示す符号ビットの役割を果たしています。
では、「8 − 5 = 3」を2の補数を使った足し算で計算してみましょう。「00001000(8)」に「11111011(−5)」を加算します。
00001000(8)
+ 11111011(−5)
-------------------
100000011
8ビットの範囲を超えて最上位に飛び出した「1」(9桁目)を無視(破棄)すると、残った値は「00000011(10進数の3)」になります。見事に足し算だけで引き算が成立していることが分かります。