教育・資格支援

【3分で理解】2の補数とは?2進数での負数の扱い方をわかりやすく解説

結論:2の補数は「引き算を足し算に変える」しくみ

2の補数とは、コンピュータが負の数を表すための表現方法です。ある数の「全ビットを反転して1を足す」だけで、その数のマイナス版が作れます。
これにより、引き算を専用の回路なしで足し算として処理できます。
本記事では「補数とは何か」から仕組み・図解・練習問題まで3分で押さえられるよう整理しました。

今回は、基本情報技術者試験でほぼ毎年出題される定番テーマ、「2の補数」と、コンピュータでの負数の表し方を、基礎からやさしく解説していきます。

「補数って言葉からして難しそう」「ビット反転して1足すのは覚えたけど、なぜそうなるのか分からない」——本当にこの相談は多いです。でも、補数の考え方と数直線のイメージさえ掴めれば、もう試験で迷うことはありません。3分で完了するので、サクッといきましょう。

この記事でわかること

・そもそも「補数」とは何か(10進数で体感)
・2進数の「1の補数」と「2の補数」の作り方
・図解でなぜ2の補数が負数表現に使われるのかを理解
・試験で確実に1点取るための練習問題3問
・実務(CPUの演算回路・符号付き整数型など)での使われ方


1. そもそも「補数」とは?


仕組み

補数とは、「ある桁数の中で、足したらちょうどキリのいい数(桁が繰り上がる数)になる、もう一方の数」のことです。

ポイントは「足すと桁が繰り上がってゼロになる相手」を探している、という点です。この「相手」を使うと、引き算をわざわざ計算しなくても、足し算だけで同じ答えにたどり着けます。これが補数の便利さの正体です。


具体例

2桁の10進数(00〜99)で考えてみましょう。この桁数で足すとちょうど1つ桁が繰り上がる基準は「100」です。「3」に対して足すと100になる数は「97」。この「97」が、2桁の世界で「3」を打ち消す相手(補数)になります。

ここで面白いのが、「45 − 3」を計算したいとき、この「97」を使えば引き算をせずに足し算で代用できるという点です。「45 + 97 = 142」となり、桁あふれした上位の「1」を捨てると「42」。きちんと「45 − 3」の答えが出ます。この「引き算を足し算に化けさせる」発想が、2進数でそのまま活きてきます。


講師視点|「補数」でつまずくポイント

僕が初学者に説明する時は以下のような伝え方をしています。

ポイント

・時計の針のイメージ(3時間戻すのと9時間進めるのは同じ位置)と伝えると掴みやすい
・あと何個でケースが満タンになるか、という「残り個数」のイメージ
・割り勘でお釣りを出すとき、相手にいくら返せば切りよく済むか、という感覚

「補数=引き算の答えそのもの」という誤解をする方が結構多い印象なので、補数はあくまで足し算で引き算を代用するための相方であって、引き算の結果とは別物、という点をしっかりと理解しておきましょう。


2. 2進数における「1の補数」と「2の補数」


仕組み

10進数で見た「補数で引き算を足し算にする」考え方は、2進数では「1の補数」と「2の補数」という形で登場します。そして2進数だからこそ、作り方が驚くほど単純になります。

1の補数は、全ビットを反転するだけ2の補数は、その1の補数にさらに1を足すだけです。これだけで、ある数の「マイナス版」が手に入ります——これが2進数で負数を扱うときの本質です。


具体例

8ビットで「+5」から「−5」を作ってみましょう。+5は2進数で00000101です。手順を1ステップずつ追いかけます。

まず全ビットを反転して11111010(これが1の補数)。次に最下位に1を足して11111011。これが−5を表す2の補数です。試しに元の00000101(+5)と足すと、8ビットの範囲では00000000(桁あふれは捨てる)になり、確かに「+5 と −5 を足すと0」が成立しています。


なぜ「反転して+1」で負になるのか(255と桁あふれ)

手順は分かっても「なぜそれで負になるのか」が腑に落ちない方が多いので、8ビットの数の動きで確かめてみましょう。

まず、ある数とその反転(1の補数)を足すと、必ず全ビットが1の11111111になります。これは10進数で255です。たとえば+5(00000101)と反転(11111010)を足すと、各桁が必ず「0と1」の組み合わせになるので、全桁1=255になるわけです。式で書くと次のようになります。

5 +(5の反転)= 255

ここに、2の補数を作るための+1を加えると、合計は256になります。

5 +(5の反転 + 1)= 256

ところが、256を2進数で書くと100000000——9桁になってしまい、8ビットには収まりません。あふれた最上位の1は桁あふれとして捨てられ、8ビットの世界では0になるのです。

256 = 100000000 →(8ビットでは)00000000 = 0

整理すると、「5 +(2の補数)= 0」が成り立っています。足して0になる相手こそ、まさに「−5」の定義そのものです。だから「反転して+1」した11111011を、安心して−5として扱えるわけです。「255になる→+1で256→桁あふれして0」という流れが、2の補数で負数を表せる本当の理由です。


講師視点|2の補数の作り方をミスらないコツ

僕が初学者に説明する時は以下のような伝え方をしています。

ポイント

・ひっくり返して、1足す」と声に出して手順をセットで覚えると掴みやすい
・スイッチのオン/オフを全部切り替えてから、最後にカチッと1つ進めるイメージ
・右端から見て、最初の1が出るまではそのまま、それより左を全部反転、という裏ワザもある

2の補数なのに反転だけで終わってしまう(+1を忘れる)」というミスをする初学者がとても多いです。反転だけだと1の補数止まり。反転してから必ず1を足す、という2ステップ目を抜かさない、という点を意識するとスムーズになります。


3. なぜ2の補数で負数を表すのか【図解+比較表】

「反転して1足す」のは分かった、でもなぜそれが負数になるのか。ここを数直線の循環イメージで確認しましょう。

ビットで表せる値には上限があり、最大値の次は一周して最小値(負の側)に戻ります。この「輪っか」の上では、ある数だけ進むのと、反対回りに同じだけ戻るのが同じ位置になります。だから「引く」=「2の補数を足す」が成立し、CPUは引き算専用の回路を持たずに済むわけです。


なぜ先頭ビットが1だと負になるのか

ここで多くの人が引っかかります。「符号なしなら1000は8のはずなのに、なぜ2の補数では−8なのか?」——理由は、同じビット列でも、各ビットの「重み」の決め方が違うからです。

4ビットを例にすると、各ビットには本来 8・4・2・1 という重みがあります。符号なしはこの重みをそのまま足すので、1000 は 8 + 0 + 0 + 0 = 8 です。

一方2の補数では、最上位ビットの重みだけをマイナスにする、つまり −8・4・2・1 と解釈します(これは2の補数のときの読み方です)。すると 1000 は −8 + 0 + 0 + 0 = −8、1111 は −8 + 4 + 2 + 1 = −1 となり、先頭ビットが1の8通りがすべて負の数(−8〜−1)に割り当たります。これが「先頭ビット=符号ビット」と呼ばれる理由です。先頭が0なら正の重みしか足されないので、必ず0以上になります。

8ビットなら重みは −128・64・32・16・8・4・2・1 です。2の補数では、最上位の128の重みだけがマイナスになる、と覚えておきましょう。たとえば11111111は −128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = −1。これは2の補数として読んだ場合の値です(同じビット列を1の補数として読むと別の値になります。詳しくは後述)。

2の補数では最上位ビットだけ重みがマイナス」という1点を押さえれば、1000が8にも−8にも見える理由がスッキリ理解できます。

「1の補数」も負数表現に使えますが、2の補数が主流なのには理由があります。表で整理しておきましょう。

項目1の補数2の補数
作り方全ビットを反転全ビットを反転して+1
0の表現+0と−0の2通りできてしまう0は1通りだけ
8ビットで表せる範囲−127 〜 +127−128 〜 +127
加算の扱い桁あふれを下位に足し戻す処理が必要そのまま足して桁あふれを捨てるだけ
採用状況歴史的に使われた現在のコンピュータの主流

ポイント

・1の補数=反転だけ、2の補数=反転して+1、と作り方の差で覚える
・2の補数なら0が1通り・引き算が足し算で済むので主流になった
・nビットの2の補数で表せる範囲は −2ⁿ⁻¹ 〜 +(2ⁿ⁻¹−1)

引き算は、引きたい数の2の補数を足すこと」という分担を覚えておくと、応用問題でもブレません。


補足|なぜ1の補数だと「+0」と「−0」ができるのか

表にある「1の補数は0が2通りできてしまう」という点は分かりにくいので、実際にビットで確かめてみましょう。8ビットの「0」は00000000です。

まず大前提として、1の補数と2の補数では、負の数の読み方(ルール)そのものが違います。よくある混乱が、2の補数の「最上位ビットの重みをマイナスにする(-128, 64, 32, …)」という読み方を、1の補数にもそのまま当てはめてしまうことです。1の補数はこの重みのルールではありません

1の補数のルールは「ある数のビットを全部反転したものが、その数の負数」というシンプルなものです。重みで負を作るのではなく、反転の関係そのもので正負を結びつけます。

このルールで0を考えてみます。00000000(=+0)を全部反転すると11111111。反転した相手が負数なので、11111111「−0」として扱われます。つまり、

00000000 = +011111111 = −0

と、どちらも値は同じ「0」なのに、ビットパターンが2通り存在してしまうのです。これが「+0と−0ができる」の意味です。値が0かどうかを判定するとき、2パターンを気にする必要があり、回路や処理が少し面倒になります。

ポイント

・同じ11111111でも、1の補数として読むと「−0」、2の補数として読むと「−1」
-128, 64, 32, …の重み計算は2の補数のルール。1の補数には使わない
・1の補数の負数は「正の数を全ビット反転したもの」と覚える

一方2の補数では、0(00000000)を反転して11111111、さらに+1すると100000000。最上位が桁あふれして消え、結局00000000に戻ります。つまり0のマイナス版もきちんと00000000になるので、0は1通りだけ。この「0がダブらない」のも、2の補数が主流になった理由のひとつです。


4. 試験対策|練習問題で確認しよう

以下は、IPA過去問の傾向を踏まえて作成したオリジナルの練習問題です(IPA公式の過去問そのものではありません)。本番形式に慣れるための練習として活用してください。実際の過去問はIPA公式サイトで公開されています。


練習問題①(ITパスポートレベル)

(問題) ある数に対し、全ビットを反転してさらに1を加えることで得られ、コンピュータで負の数を表すために使われる表現はどれか。

ア.1の補数
イ.BCD
ウ.2の補数
エ.固定小数点

👉 正解:ウ(2の補数)

解説:「反転して+1」がキーワード。1の補数(ア)は反転だけで+1をしない表現、BCD(イ)は10進数の各桁を4ビットで表す方式、固定小数点(エ)は小数を扱う形式なので、2の補数が正解です。


練習問題②(基本情報レベル)

(問題) 8ビットの2進数 00010011 を、2の補数表現で負の数にしたものはどれか。

ア.00010100
イ.11101100
ウ.10010011
エ.11101101

👉 正解:エ(11101101

解説:00010011の全ビットを反転すると11101100(イ=1の補数)。これに1を足した11101101が2の補数です。イ(ア)は+1を忘れた値なので引っかからないよう注意。ウは符号ビットだけ変えた誤りです。


練習問題③(混同しやすいポイント)

(問題) 次のうち、8ビットの2の補数表現に関する説明として最も適切なものはどれか。

ア.表せる値の範囲は −127 から +127 である
イ.0の表現が+0と−0の2通り存在する
ウ.表せる値の範囲は −128 から +127 である
エ.最上位ビットが1のとき正の数を表す

👉 正解:ウ

解説:アとイは1の補数の特徴、エは符号ビットの説明が逆(1のとき負)です。8ビットの2の補数は0が1通りで負側に1つ多く取れるため、「−128〜+127」「最上位ビットが1なら負」という表現を見たら、2の補数と判断できればOKです。


5. 実務ではどう使われている?

試験対策だけでなく、現場でも当たり前に登場する考え方です。

2の補数は、ほぼすべてのCPUの内部で、整数の引き算を行うために使われています。加算回路に2の補数を流し込むことで減算をまかなえるため、引き算専用の回路を別に持つ必要がありません。これがハードウェアの単純化とコスト削減に直結しています。

プログラミングでも、C言語のintやJavaのintといった符号付き整数型は、内部的に2の補数で負数を表現しています。整数があふれて急にマイナスの巨大な値になる「オーバーフロー」も、この循環するビットパターンの性質から生まれる現象です。クラウドや高級言語の時代になっても、足元の数値表現は2の補数のまま変わっていません。


6. まとめ|一言で覚えるポイント

ポイント

・補数=足すとキリよく繰り上がる相方(引き算を足し算に変える道具)
・2の補数=全ビット反転して+1(反転だけは1の補数)
・引き算は「引きたい数の2の補数を足す」で計算できる

基本情報の試験では、「反転して+1」「8ビットなら−128〜+127」「最上位ビットが符号」という3点さえ押さえておけば確実に1点取れる「サービス問題」です。余力があれば、固定小数点・浮動小数点との違いや、桁あふれ(オーバーフロー)の判定方法まで押さえておくと、計算問題で差がつきます。

2進数や16進数に不安のある方は基数変換についてわかりやすくまとめた記事もあります。
こちらも試験頻出なので、セットで押さえておきましょう。

それではまた!

こちらもCHECK

2進数・16進数の変換は暗記不要!コツ2つで解ける【ITパスポート/基本情報】

今回はIPAの情報処理試験で頻出の「2進数と16進数」の変換方法を解説します。 「あー!もう2進数とか16進数とか無理!!」 と、問題を見た瞬間にあきらめていませんか? 英単語のような暗記は不要で、覚 ...

続きを見る

一人で悩まず、相談しながら合格を目指したい方へ

「独学だと続かない…」「2進数の計算でつまずいて誰かに質問したい…」
そんな方向けに、エンジニア歴20年・現役講師の僕が運営する無料LINEコミュニティを用意しています。資格学習のコツ・勉強法・キャリア相談まで、気軽に質問できる場所です。

▶ ITキャリアラボに参加する(無料)

ITキャリアラボ

【無料】ITの悩みを気軽に相談できるコミュニティ・ITキャリアラボ

IT業界を目指すあなたへ|「ITキャリアラボ」無料コミュニティのご案内 「IT業界に転職したいけど、何から始めればいいかわからない…」「資格の勉強が続かない…」「相談できる人がいない…」 そんな不安、 ...

続きを見る

  • この記事を書いた人
  • 最新記事

ユウイチ

20年間ソフトウェアエンジニアとして働いた後、フリーランスを経て現在は1人社長として活動。 プログラミング講師やIT教育を中心に活動しながら、趣味でゲーム開発やシナリオ作成にも挑戦中。どちらも「創ることを通じて人を笑顔にしたい」という想いから始めた、大切なライフワーク。 「創造と教育で、人生に迷う人の“自由な一歩”を支援」を理念に発信中。

-教育・資格支援