A − B を A + (Bの2の補数) に置き換えて計算する仕組みを、各ステップでビットの動きを追いながら学びます。最上位の桁あふれを捨てるルールがポイントです。
補数を使った減算とは、「A − B を A + (Bの2の補数) に置き換えて計算する」テクニックです。
・引き算したい数(B)の2の補数を作る
・元の数 A に、その2の補数を足し算する
・最上位から出た桁あふれは捨てる
これは「2の補数 = -B と同じ意味」を利用したトリックです。A − B = A + (-B) という当たり前の式変形を、ビットの世界で実現したものと考えるとシンプルです。
上のツールでスライダーを動かしてみてください。STEP 1〜3 を順番に追うと、「期待される答え」と「桁あふれを捨てたあとの結果」が一致するのが確認できます(A >= B のとき)。
CPU の中には加算回路(Adder)があります。引き算専用の回路を別に作らなくても、補数を使えば加算回路だけで減算もできるので、ハードウェア設計がとてもシンプルになります。これがコンピュータが2の補数を使う最大の理由です。
実際の手順は次のようになっています。
・通常の足し算: A + B
・減算したいとき: A + (Bを全反転) + 1
・「全反転 + 1」を1の補数 + 1として理解すると、ちょうど2の補数を作って加算していることになります
身近な例で考えると、ガソリンを「足す」のと「抜く」のに同じホースを使うような工夫です。専用設備を増やさずに、入力の方向を変えるだけで両方の操作ができる──そんなアイデアです。
補数を使った減算で必ず確認すべきことは、加算後に最上位から出る桁あふれです。これは「捨てる」のか「重要なエラー信号」なのかが場面で変わります。
| ケース | A vs B | 桁あふれ | 扱い |
|---|---|---|---|
| 正の結果になる | A >= B | 1(出る) | そのまま捨てる。下位ビットが正しい答え |
| 負の結果になる | A < B | 0(出ない) | 結果ビット列を2の補数で読むと負の数 |
| 符号エラー | 表現範囲を超える | 符号ビットの矛盾 | オーバーフロー(別ページ参照) |
押さえておきたいポイント:
・「桁あふれを捨てる」ルールが正しい答えを得る前提になる
・「結果が負になるケース」の解釈には2の補数の知識が必要(A < B のとき)
・符号付き整数を扱うときは「符号ビット」と「桁あふれ」を混同しないように注意
上のツールで「50 - 30 = 20」のプリセットを試すと、最上位から赤い「1(捨)」が出るのが見えます。これが捨てられて、下位8ビットの 00010100 = 20 が正しい答えとして残ります。桁あふれを捨てるという挙動は「不具合」ではなく、補数による減算の正しい仕組みです。