computer system foundationCSF 2026
デジタル回路基礎 / 01.3

2の補数

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

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

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

なぜ補数が必要?

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

引き算回路の問題点

引き算には「借り(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)」と同じ結果になる。 これは補数の直感的な意味で、2進数の世界でも同じように「足し算で表す」ことができる。
02

符号付き整数の表現方法

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
00000000 = 0
10000000 = −128
0が一意で、普通の加算器そのままで使える。

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

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

MSB=1 の場合は負の数として扱う

03

2の補数への変換

手順を1ステップずつ確認する

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

2の補数 計算器

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

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

加算器内部の計算過程

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

数直線で視覚化

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

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

理解度チェッククイズ