➖🔄➕
コンピュータの設計

2の補数

なぜ引き算が足し算でできるのか?

コンピュータは引き算の回路を持たない——
2の補数という巧妙なトリックで、加算器だけで引き算を実現する。

⏱ 所要:25–35分難易度:★★☆前提:2進数の基礎
Section 1

なぜ補数が必要?

まず「引き算は大変」という問題を理解しよう

❌ 引き算回路の問題点

引き算には「借り(borrow)」の伝搬が必要で、回路が複雑になる。 加算器とは別に減算器を作ると回路面積が2倍になる。

// 5 - 3 を単純にやろうとすると…
0101 (5)
- 0011 (3)
← 借りの処理が複雑!

✅ 補数のアイデア

「−3を足す」ことは「3の2の補数を足す」と等価。 減算を加算に変換することで、1種類の回路(加算器)だけで済む!

// 5 - 3 = 5 + (-3) として考える
0101 (5)
+ 1101 (-3 の2の補数表現)
= 0010 (2) ✓
💡 時計のアナロジー: 12時間時計で「2時間前(−2)」は「10時間進む(+10)」と同じ結果になる。 これが補数の直感的な意味だ。12進では 10 が −2 の「補数」、 2進8ビットでは 256 を法(モジュロ)として考える。
Section 2

符号付き整数の表現方法

3つのアプローチとそれぞれの問題点

🚩

符号絶対値

最上位ビット(MSB)を符号ビットとして、残りで絶対値を表す。

00000101 = +5
10000101 = −5
00000000 = +0
10000000 = −0 ← 問題!
❌ 「+0」と「−0」が2つ存在する。加算回路が複雑。
🔄

1の補数

負の数は全ビットを反転(NOT)して表す。

00000101 = +5
11111010 = −5 (ビット反転)
00000000 = +0
11111111 = −0 ← 問題!
❌ やはり「−0」が存在。End-around carry が必要。

2の補数(採用)

全ビット反転 +1 で負の数を表す。

00000101 = +5
11111011 = −5 (反転+1)
00000000 = 0 ← 一意!
10000000 = −128 (4ビット:-8)
✅ 0が一意。普通の加算器がそのまま使える!

📊 4ビット符号付き整数の対応表(2の補数)

2進数 10進数(符号なし) 10進数(2の補数)

MSB=1 の場合は負の数(赤くハイライト)

Section 3

2の補数への変換

アニメーションで手順を1ステップずつ確認

1 2進数に変換
00000101
8ビットで表す
2 全ビット反転(NOT)
1→0、0→1 に反転
3 1を加算
🔑 覚え方のコツ: 「反転して+1」のほかに、「右から最初の1はそのまま、それより左を反転」という ショートカットもある。例えば 00101100 → 右から最初の1は3ビット目、 それより左を反転 → 11010100
Section 4

2の補数 計算器

ビットを直接クリックして操作しよう

入力 A
2の補数 10進:0 符号なし 10進:0
演算
入力 B
2の補数 10進:0 符号なし 10進:0

📋 加算器内部の計算過程

計算結果
2の補数 10進:0 符号なし 10進:0
Section 5

数直線で視覚化

4ビット2の補数の全16通りを数直線上で確認

0
2進数: 0000 符号ビット(MSB):
🔄 折り返し(Wrap-around): 4ビットでは 7(0111)+ 1 = -8(1000) になる。 加算でオーバーフローすると符号が反転して見える。これが2の補数の折り返し特性だ。 8ビットなら 127 + 1 = −128 になる。
Section 6

理解度チェッククイズ