メインコンテンツへスキップ

補数とは

🧮 はじめに

このページでは、「補数(complement)」という概念を出発点に、特にコンピュータで広く使われている「2の補数(two's complement)」について詳しく解説します。なぜそんな仕組みがあるのか? どうやって計算するのか? どんなメリットがあるのか?といった疑問に答える内容です。


🧠 補数とは?

🔢 補数の基本的な意味

補数とは、ある数に足すと決まった値になる数のことです。
最も身近な例は「10の補数」や「100の補数」など、桁数を基準とした補数です。

例:

  • 10の補数 → 足して10になる数
    → 3の補数は 7(3 + 7 = 10)

  • 100の補数 → 足して100になる数
    → 23の補数は 77(23 + 77 = 100)

補数は「減算を加算に変える」ためのテクニックとして使われてきました。これが後にコンピュータにも応用されます。


⚙️ コンピュータと補数:なぜ必要?

コンピュータでは、「引き算(減算)」よりも「足し算(加算)」のほうがハードウェア的に実装しやすいため、減算を補数による加算に変換して処理するのが基本になっています。


🧩 2の補数とは?

🧱 定義

2の補数とは、ある n ビットの2進数で、負の数を表すための方法です。

「2の補数」は次のように定義されます:

ある数 x の2の補数 = 2ⁿ − x
ただし、x は正の整数、n はビット数

この定義により、正数も負数も同じ加算器で処理できるようになります。


✏️ 実際にやってみよう:8ビットの例

🌟 正の数(例:+5)

  +5 → 00000101(8ビット)

🌑 負の数(例:−5)

  1. +5 をビット反転(1の補数)
    0000010111111010

  2. 1 を加える
    11111010 + 1 = 11111011

  −5 → 11111011(8ビット)

この「ビット反転+1」こそが、2の補数を求める実用的な手順です!


🧮 2の補数の特徴とメリット

✅ 加減算が統一できる

例:7 + (−5)

  7 → 00000111
 −5 → 11111011(2の補数)

加算:00000111 + 11111011 = 00000010(オーバーフローは捨てる)

結果:2(正しい!)

✅ −0 という存在がなくなる

符号ビット方式では +0, −0 の2通りがありましたが、2の補数では 0 は唯一です。

✅ ビット反転+1だけで負数が得られる

加算回路のまま、減算も表現できるため、ハードウェア実装がシンプルになります。


⚠️ 注意点(ビット数の制限)

2の補数表現はビット数が固定でないと意味を持ちません。例えば、8ビットの場合:

  • 表現可能な範囲:−128 ~ +127

範囲を超えるとオーバーフローになります。これは計算ミスの原因になるので注意が必要です。


🔚 まとめ

用語 意味や役割
補数 足して決まった数(10、100、2ⁿなど)になる数
2の補数 2ⁿ − x、ビット反転+1でも求められる
使う理由 加減算を統一し、ハードウェア設計を簡略化
メリット −0がない、加算だけで済む、効率がいい
表現範囲制限 ビット数に応じた表現可能な範囲に注意