FE EXAM

補数を使った減算(引き算を足し算に変える)

A − BA + (Bの2の補数) に置き換えて計算する仕組みを、各ステップでビットの動きを追いながら学びます。最上位の桁あふれを捨てるルールがポイントです。

INTERACTIVE VISUALIZATION
A
B / 補数
結果
普通の引き算
5030
期待される答え
20
補数で計算した結果(桁あふれ捨てる)
20 ✓ 一致
A(引かれる数)50
B(引く数)30
プリセット
3ステップで減算を加算に変える: ① Bを反転 → ② +1で2の補数に → ③ A + 2の補数を足し算、最後に最上位の桁あふれを捨てる。下の各行を見比べてください。
STEP 1 — A と B を2進数で
A
0
0
1
1
0
0
1
0
= 50
B
0
0
0
1
1
1
1
0
= 30
STEP 2 — B の2の補数を作る(反転 → +1)
Bを反転
1
1
1
0
0
0
0
1
= 225
Bの2の補数
1
1
1
0
0
0
1
0
= 226
STEP 3 — A + (Bの2の補数) を足し算
A
0
0
1
1
0
0
1
0
= 50
+ 2の補数
1
1
1
0
0
0
1
0
= 226
結果
1
0
0
0
1
0
1
0
0
= 20
最上位から桁あふれ(1)が出ました。 このビットは捨てて下位8ビットだけを答えとして採用します。 これが「A >= B のとき、補数を使った減算で正しい答えが出る」仕組みです。
解説

📌
補数を使った減算とは

A − BA + (-B)「-B」を2の補数で作れば、引き算が足し算になるこれでハードウェアは「足し算回路」だけで両方できる

補数を使った減算とは、「A − B を A + (Bの2の補数) に置き換えて計算する」テクニックです。
・引き算したい数(B)の2の補数を作る
・元の数 A に、その2の補数を足し算する
・最上位から出た桁あふれは捨てる

これは「2の補数 = -B と同じ意味」を利用したトリックです。A − B = A + (-B) という当たり前の式変形を、ビットの世界で実現したものと考えるとシンプルです。

上のツールでスライダーを動かしてみてください。STEP 1〜3 を順番に追うと、「期待される答え」と「桁あふれを捨てたあとの結果」が一致するのが確認できます(A >= B のとき)。

📌
加算回路だけで減算できる仕組み

CPU内部のイメージ加算回路(これだけ)ABNOT結果減算モード時:Bを反転し、桁上げ初期値を+1

CPU の中には加算回路(Adder)があります。引き算専用の回路を別に作らなくても、補数を使えば加算回路だけで減算もできるので、ハードウェア設計がとてもシンプルになります。これがコンピュータが2の補数を使う最大の理由です。

実際の手順は次のようになっています。
・通常の足し算: A + B
・減算したいとき: A + (Bを全反転) + 1
・「全反転 + 1」を1の補数 + 1として理解すると、ちょうど2の補数を作って加算していることになります

身近な例で考えると、ガソリンを「足す」のと「抜く」のに同じホースを使うような工夫です。専用設備を増やさずに、入力の方向を変えるだけで両方の操作ができる──そんなアイデアです。

📌
桁あふれの扱い

補数を使った減算で必ず確認すべきことは、加算後に最上位から出る桁あふれです。これは「捨てる」のか「重要なエラー信号」なのかが場面で変わります。

ケースA vs B桁あふれ扱い
正の結果になるA >= B1(出る)そのまま捨てる。下位ビットが正しい答え
負の結果になるA < B0(出ない)結果ビット列を2の補数で読むと負の数
符号エラー表現範囲を超える符号ビットの矛盾オーバーフロー(別ページ参照)

押さえておきたいポイント:
・「桁あふれを捨てる」ルールが正しい答えを得る前提になる
・「結果が負になるケース」の解釈には2の補数の知識が必要(A < B のとき)
符号付き整数を扱うときは「符号ビット」と「桁あふれ」を混同しないように注意

上のツールで「50 - 30 = 20」のプリセットを試すと、最上位から赤い「1(捨)」が出るのが見えます。これが捨てられて、下位8ビットの 00010100 = 20 が正しい答えとして残ります。桁あふれを捨てるという挙動は「不具合」ではなく、補数による減算の正しい仕組みです。

関連コンテンツ