補数(complement)

負の数を2進数で表すための形。2の補数を使うと、引き算を足し算で計算できる。

もう少し詳しい説明

補数は、負の数を2進数で表すための形です。

2進数には0と1しかなく、「−(マイナス)」の記号がありません。そこで、ビットの並びの一部を負の数に割り当てる決まりを作ります。いまのコンピュータで使われているのが2の補数です。

2の補数の作り方

全ビットを反転して、1を足す。 手順はこれだけです。

+500000101① 反転する11111010② 1を足す → −511111011
+5 のビットをすべて反転し、最後に1を足すと −5 になります。これが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)」として、同じ足し算の回路で処理できます。引き算専用の回路を持たなくて済むのが、補数を使う理由です。

表せる範囲

ここは数字として問われます。

先頭のビット1(負の数)0(0と正の数)表せる数−128 〜 −10 〜 127通り128通り128通り
8ビットで作れる並びは256通りです。そのうち先頭が1の128通りを負の数(−128〜−1)に、先頭が0の128通りを0と正の数(0〜127)に割り当てます。0が正の側に1つ入るぶん、正の数は1つ少なくなります。

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ビット)1111101011111011
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つだけです。

範囲で迷ったら、**「0を正の側に入れたぶん、正が1つ減る」**と考えると、どちらが128でどちらが127かを取り違えません。

→ 2の補数の練習問題を解く

試験ではこう出る

科目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