補数(complement)
- テクノロジ系
- 基礎理論
- 基本情報
- 応用情報
- 重要度 ★★★★☆
負の数を2進数で表すための形。2の補数を使うと、引き算を足し算で計算できる。
もう少し詳しい説明
補数は、負の数を2進数で表すための形です。
2進数には0と1しかなく、「−(マイナス)」の記号がありません。そこで、ビットの並びの一部を負の数に割り当てる決まりを作ります。いまのコンピュータで使われているのが2の補数です。
2の補数の作り方
全ビットを反転して、1を足す。 手順はこれだけです。
8ビットで −5 を作ってみます。
+5 = 00000101 ① 反転 … 0と1を入れ替える → 11111010 ② 1を足す → 11111011 = −5
先頭のビットが1なら負の数、0なら正の数です。この先頭のビットを符号ビットと呼びます。
逆に、2の補数から元の数を知りたいときも、**同じ手順(反転して1を足す)**で戻せます。11111011 を反転すると 00000100、1を足すと 00000101 = 5。だから元は −5 だった、と分かります。
なぜ「補数」と呼ぶのか
+5 と −5 を、そのまま足してみます。
00000101 (+5)
+ 11111011 (-5)
------------
1 00000000
9桁目に1があふれて、8ビットの中はすべて0になりました。8ビットで計算しているので、あふれた1は捨てます。つまり 5 +(−5)= 0 が、ふつうの足し算で成り立っています。
足すとちょうど桁が1つ上がる(8ビットなら 1 00000000 になる)相手、それが2の補数です。「補う数」という名前は、この関係から来ています。
補数を使うと、引き算を足し算で計算できます。「8 − 5」は「8 +(−5)」として、同じ足し算の回路で処理できます。引き算専用の回路を持たなくて済むのが、補数を使う理由です。
表せる範囲
ここは数字として問われます。
8ビットで作れる並びは 2⁸ = 256通り。そのうち先頭が1の128通りを負の数に、先頭が0の128通りを0と正の数に割り当てます。
8ビットの2の補数 … −128 〜 127
正の数が1つ少ないのは、0が正の側に含まれているからです。
ビット数を n とすると、一般にはこう書けます。
−2ⁿ⁻¹ 〜 2ⁿ⁻¹ − 1
8ビットなら n = 8 を入れて、−2⁷ = −128 から 2⁷ − 1 = 127 まで。16ビットなら −32768 〜 32767 です。
1の補数との違い
ビットを反転しただけのものを1の補数と呼びます。2の補数から「1を足す」を抜いた形です。
| 1の補数 | 2の補数 | |
|---|---|---|
| 作り方 | 反転するだけ | 反転して1を足す |
| −5(8ビット) | 11111010 | 11111011 |
| 0 の表し方 | 2通り(00000000 と 11111111) | 1通り |
| 8ビットの範囲 | −127 〜 127 | −128 〜 127 |
1の補数は、元の数と足すとすべてのビットが1(8ビットなら 11111111)になる数です。2の補数と違い、桁は上がりません。
1の補数でも引き算を足し算にできますが、あふれた桁をいちばん下の桁に足し戻す手間(循環桁上げ)が要ります。さらに 00000000(+0)と 11111111(−0)の2つの0ができてしまい、扱いにくい。2の補数は0が1通りで、足し戻しも要らないので、こちらが主流になりました。
覚え方:反転して1、範囲は負が1つ多い
覚えるのは2つだけです。
- 作り方 … 反転して1を足す(戻すときも同じ)
- 範囲 … 負の数のほうが1つ多い(8ビットなら −128〜127)
範囲で迷ったら、**「0を正の側に入れたぶん、正が1つ減る」**と考えると、どちらが128でどちらが127かを取り違えません。
試験ではこう出る
科目A(旧・午前)の基礎理論分野で出ます。多いのは、10進数の負の数を2の補数で表させる問題(またはその逆)と、nビットで表せる範囲を答えさせる問題です。応用情報では、補数を使った引き算の結果や、範囲を超えたとき(オーバフロー)に何が起きるかを問う形になります。
範囲の問題は、−2ⁿ⁻¹ 〜 2ⁿ⁻¹ − 1 の式に入れれば答えが出ます。選択肢に「−127〜127」があれば、それは1の補数の範囲です。変換の問題は、反転して1を足すを手で書いて進めてください。頭の中だけで反転すると、1の足し忘れが起きやすくなります。
関連する用語
- 基数変換
- 10進数・2進数・16進数を互いに書き直すこと。補数を扱う前に必要になる
- シフト演算
- ビットをずらす演算。負の数を右へずらすときは、補数の符号を保つ算術シフトを使う
- 浮動小数点数
- 数を符号・指数・仮数に分けて表す形式。補数とは別の方法で符号を持つ
- オーバフロー
- 計算結果が、決まったビット数で表せる範囲を超えてしまうこと
- 1の補数
- ビットを反転しただけのもの。0が2通りできてしまうため、いまは2の補数が主流
ミニクイズ
8ビットの2の補数表現で表せる整数の範囲はどれか。
正解は 2番:−128 〜 127
8ビットで作れる並びは 2⁸ = 256 通りです。2の補数では、先頭が1の128通りを負の数(−128〜−1)に、先頭が0の128通りを0と正の数(0〜127)に割り当てるので、範囲は −128〜127 になります。「−127〜127」は1の補数の範囲で、+0 と −0 の2つの0ができるぶん、表せる数が1つ少なくなります。「−127〜128」は正と負を逆に割り当てていて誤りです。「0〜255」は符号を使わない場合の範囲です。
最終更新:2026-09-21