2の補数表現とは(全体像)
2の補数は、コンピュータでマイナスの数を表すための決まったルールのこと。コンピュータは0と1しか持っていないので、「-3」のような負の数も0と1の並びで表す必要がある。その標準的なやり方が2の補数だ。
ポイントは、先頭のビットが符号の役割を持つこと。先頭が0なら正の数、1なら負の数になる。とはいえ、ただ符号ビットを立てるのではなく、「反転して+1」という決まった手順でマイナスを作るのがミソだ。
この方式が選ばれている理由は、引き算を足し算として処理できるから。コンピュータの中身(加算器)をシンプルにできるので、ハードウェアにとってありがたいしくみになっている。
詳しく:この手順と範囲だけ覚えれば戦える
ここが記事の心臓部。まずは作り方の2ステップ。
2の補数の作り方(例:8ビットで -3)
| 手順 | 操作 | 結果 |
|---|---|---|
| 元の数 | +3 を2進数で書く | 0000 0011 |
| ①反転 | 全ビットを反転(1の補数) | 1111 1100 |
| ②+1 | 1を足す | 1111 1101(= -3) |
このように「全ビット反転 → +1」でマイナスのビット並びができる。途中の「反転しただけ」の状態(1111 1100)は1の補数と呼ばれ、2の補数とは1つ違う別ものなので混同に注意だ。
次に、表せる範囲。nビットで表せる数は決まっている。
表せる範囲(nビット)
| ビット数 | 表せる範囲 |
|---|---|
| 8ビット | -128 〜 +127 |
| 16ビット | -32768 〜 +32767 |
| 一般(nビット) | -2^(n-1) 〜 +2^(n-1)-1 |
ここで大事なのは、範囲が左右対称ではないこと。マイナス側が1つ多い(8ビットなら-128まであるのに+127まで)。これは0を表す並びが1つだけ(全部0)で済むからだ。1の補数だと+0と-0の2つができてしまうが、2の補数では0は1つだけで無駄がない。
つまり、2の補数は「0が1つ・範囲がマイナス側に1多い」と覚えればいい。
わかりやすく言い換えると
要するに、2の補数は「反転して+1でマイナスを作る」、これだけ。
①まず元の正の数を2進数で書く
②全部のビットをひっくり返す(0↔1)
③最後に+1する → これがマイナスの正体
便利さのイメージは「引き算を、足し算の振りをして解く」こと。A−Bを計算したいとき、Bのマイナス(2の補数)を作ってAに足せば、答えは引き算と同じになる。だから引き算専用の回路が要らず、足し算回路を使い回せるんだ。
試験のツボ
🔴 一番出る:作り方は「反転して+1」
①元の数を2進数で書く
②全ビットを反転する(1の補数)
③+1すると2の補数(マイナス)になる
🔴 次に出る:表せる範囲はマイナス側が1多い
①8ビット=-128〜+127
②nビット=-2^(n-1)〜+2^(n-1)-1
🟡 押さえると安定:0は1つだけ・引き算は加算でできる
①2の補数は0が単一(1の補数は+0と-0の二重)
②A-B=A+(-B)で加算器を使い回せる
よくある間違い
①「1の補数と2の補数は同じ」→ ✗ 1の補数は反転だけ。2の補数はそれに+1する。1つ違う。
②「8ビットの範囲は-127〜+127で左右対称」→ ✗ マイナス側が1多く、-128〜+127。0が1つで済むぶんの差。
③「マイナスを表すには符号ビットを1にするだけ」→ ✗ 反転して+1する手順が必要。先頭1にしただけでは正しい値にならない。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(作り方)
2の補数の作り方に関する次の記述のうち、正しいものはどれか。
- 2の補数は、元の数の全ビットを反転するだけで得られ、+1する操作は不要である
- 2の補数は、元の数の全ビットを反転し、さらに1を足すことによって得られる
- 2の補数は、元の数の先頭ビットだけを1に書き換えることによって得られる
- 2の補数は、元の数の全ビットを反転し、さらに2を足すことによって得られる
解答は 2 だぜ。
2の補数は「全ビットを反転して、+1する」。これでマイナスのビット並びになる。例えば8ビットの+3(0000 0011)なら、反転して1111 1100、+1して1111 1101が-3だ。
選択肢1は「反転だけ」で、これは1の補数。選択肢3の「先頭ビットだけ1」では正しい値にならない。選択肢4の「+2」も誤りで、足すのは1だぜ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 反転だけは1の補数 |
| 2 | ✓ | 反転して+1で正しい |
| 3 | ✗ | 先頭1だけでは正しい値にならない |
| 4 | ✗ | 足すのは2ではなく1 |
オリジナル問題2(表せる範囲)
8ビットの2の補数で表せる数の範囲に関する次の記述のうち、正しいものはどれか。
- 8ビットの2の補数では、0から255までの256とおりの正の整数を表すことができる
- 8ビットの2の補数では、-127から+127までの左右対称な範囲の整数を表せる
- 8ビットの2の補数では、-256から+255までの広い範囲の整数を表すことができる
- 8ビットの2の補数では、-128から+127までの範囲の整数を表すことができる
解答は 4 だぜ。
8ビットの2の補数は -128〜+127を表せる。マイナス側が1つ多いのがポイントだ。0を表す並びが全部0の1つだけで済むぶん、マイナスに1多く割けるんだな。
選択肢1は符号なし(0〜255)の話。選択肢2の「-127〜+127」は左右対称にしてしまった誤り。選択肢3の範囲は広すぎで誤りだぜ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | これは符号なし整数の範囲 |
| 2 | ✗ | 実際はマイナス側が1多い |
| 3 | ✗ | 8ビットでこの範囲は表せない |
| 4 | ✓ | -128〜+127で正しい |
オリジナル問題3(便利さ)
2の補数が使われる理由に関する次の記述のうち、正しいものはどれか。
- 2の補数は引き算を足し算として処理でき、0の表し方も1とおりに定まる方式である
- 2の補数は0が+0と-0の2とおりあり、その分だけ表せる数の範囲が広がる方式である
- 2の補数は引き算専用の回路が別に必要となるが、計算の速度が大幅に上がる方式だ
- 2の補数は小数の表現に特化しており、整数のマイナスを表すのには向かない方式だ
解答は 1 だぜ。
2の補数の利点は2つ。引き算を足し算で処理できる(A-B=A+(-B))こと、そして0が1つだけに定まることだ。だから加算器を使い回せて回路がシンプルになる。
選択肢2は「0が2とおり」としているが、それは1の補数の弱点。選択肢3は「引き算専用回路が必要」が逆で、要らなくなるのが利点だ。選択肢4の「小数に特化」も誤りで、整数のマイナスを表す方式だぜ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | 引き算を加算で処理・0が単一 |
| 2 | ✗ | 0が2とおりなのは1の補数 |
| 3 | ✗ | 引き算専用回路は不要になる |
| 4 | ✗ | 整数のマイナスを表す方式 |
まとめ
押さえどころ
- 🔴 作り方 = 全ビット反転して+1。反転だけは1の補数(1つ違い)。
- 🔴 表せる範囲 = 8ビットで-128〜+127。マイナス側が1多い(nビットは-2^(n-1)〜+2^(n-1)-1)。
- 🟡 利点 = 0が1つだけ・引き算を足し算として処理でき、加算器を使い回せる。
次に学ぶ
- 浮動小数点数(IEEE 754) ── 小数(実数)の表し方。整数のマイナスは2の補数、小数は浮動小数点と、対にして覚えると整理しやすい。
- 基数変換 ── 2進数と10進数を行き来する計算。2の補数の例も2進数なので、基数の感覚があると手が動くようになる。
執筆: SikakuQuest編集部