こんにちは!

toiroフリーランス編集部です。

コンピュータの世界を支える「2の補数」。

基本情報技術者試験の勉強をはじめると、真っ先に「ビットを反転して1を足す」という手順が出てきます。

ITのことを勉強しない限りは、基本的に触れることのない分野であり、常識といえるような内容ではないでしょう。

それだけに、情報処理・IT嫌いになるきっかけになり得るかもしれない分野です。

とはいえ、考え方を理解さえしてしまえばさほどむずかしいものではありません。

この記事では、2の補数でつまずきやすいポイントを整理し、仕組みから計算方法までをステップバイステップで解説します


2の補数はなぜ必要なのか

コンピュータは「0」と「1」しか扱えません。

私たちが普段使う「-(マイナス)」という記号を、コンピュータにそのまま理解させるのは実はむずかしいことなのです。

そもそも「補数」とは何か

補数とは、一言でいえば「足してキリのいい数字にするために、足りない分」のことです。

  • 10進数の例
    「7」に対する10の補数は「3」です(7 + 3 = 10)。
  • 2進数の例
    ある数に足して、ちょうど一つ上の桁に繰り上がる最小の数が「2の補数」です。

コンピュータが負の数を扱うときの課題

コンピュータの心臓部(CPU)は、実は「引き算」よりも「足し算」が得意です。

引き算専用の回路を作るよりも、「負の数を、足し算できる形に変換して処理する」方が、

回路をシンプルに、高速にできるという事情があります。

【補足】技術的な背景

2の補数の採用は、純粋な数学的理由というよりは
「ハードウェア設計を単純にするための賢い割り切り」です。
足し算と引き算を共通の回路(加算器)で処理できるため、
製造コストを抑えつつ処理速度を上げられるという大きな利点があるのです。

2の補数とは?一言でいうと「ビット反転+1」

負の数を作る具体的な手順は、驚くほど機械的です。

2の補数のつくり方

1.ビットを反転させる: 0を1に、1を0に入れ替えます。

補足:「ビット」とは、2進数の各けたの 0 または 1 のことです。
ビットを反転させる:0 を 1 に、1 を 0 に入れ替えます。
例)0101 → 1010 のように、全部の 0/1 をひっくり返します。

2.1を足す: 反転させたものに、1を加えます。

補足:反転させたものに、1 を加えます。
例)1010 に 1 を足して 1011 にします。
こうすることで、元の数の「マイナス」をコンピュータが扱いやすい形に変えたもの(2 の補数)ができます。

💡たとえば

4ビット(0か1が4桁並んだ二進数)で「5」を表すと「0101」になります。

これは、右から順に「1の位・2の位・4の位・8の位」と考え、

0101 = 0×8 + 1×4 + 0×2 + 1×1 = 5 となるからです。

この「0101」から「-5」を作る場合:

  1. ビットを反転させる:1010
  2. 1を足す:1011(これが-5)

直感的なイメージ:メーターの「一周」

車の走行距離メーターのイメージ

車の走行距離メーターを想像してください。

「0000」から1km戻すと「9999」になりますよね。

2進数の世界でも、「0000」から1引くと「1111」になります。

この「逆回転して一周した先にある数字」を負の数とみなすのが、2の補数の直感的なイメージです。

【編集者メモ】

ここで大切なのは、「どこから負の数とみなすかは、人間が決めたルールである」という点です。
コンピュータ自身はただビットを並べているだけで、それを「マイナス」として解釈する約束事を私たちが決めているに過ぎません。


【重要】ここまでの要点まとめ

この後のセクションは、より詳しい「試験対策」や「プログラミング実務」の話に入ります。

まずは、ここまでの「これだけは絶対に忘れないで!」というポイントをまとめました。

まず覚えるべき4項目

  1. 2の補数のつくり方: ビットを反転させて1を足す。
  2. 負の数の見分け方: 最上位ビット(一番左)が「1」なら負の数。
  3. 表現範囲:nビットなら -2^(n-1) ~ 2^(n-1)-1。
  4. オーバーフロー: 正の最大値に1を足すと、負の最小値にループする。

まずはこれだけ覚えれば十分です。

この4点さえ押さえておけば、大抵の会話や基本的な計算問題には対応できます。
ここから先は、より専門性を高めたい方へのステップアップガイドです。


ここから先は、あなたの目的別に内容を深掘りしていきます。

  • 基本情報技術者試験を控えている人 → 試験対策セクション
  • 実務での数値計算やバグの原因を知りたい人 → 実務・仕組みセクション
  • C言語などのプログラミング挙動を正確に知りたい人 → C言語補足セクション

【試験対策】2の補数の表現範囲と計算

対象: 試験合格を目指す人、計算問題を解けるようになりたい人。
読み飛ばし: 計算に自信があるなら飛ばしてもOKですが、最小値の計算は要注意です。

4ビットの境界値対応表

試験で狙われやすいのは「端っこの数字」です。4ビット(16パターン)を例に見てみましょう。

2進数(4ビット)符号付き(2の補数意味・役割
01117正の最大値
00011最小の正の数
00000ゼロ
1111-1最大の負の数(0の隣)
1000-8負の最小値

表現範囲:なぜ負の数が1つ多いか

8ビットの場合、範囲は -128 ~ 127 です。

4ビットのときと同じように、「各ビットに重みをかけて足し合わせる」考え方で、ただし一番左のビットだけはマイナスの重みとして扱います。

負の最小値(-128)は、反転して1を足しても元のビットパターンに戻る特殊な値です。

そのため、対応する正の数(+128)が存在せず、結果としてマイナス側に1つ多い「いびつな範囲」になっています。

【実務・仕組み】なぜ足し算で引き算ができるのか

対象: エンジニアとして、コンピュータの内部動作を納得して理解したい人。
読み飛ばし: 理屈よりも使い方が知りたい人は飛ばしてもOKです。

このセクションでは、「意味より計算のしやすさを優先する」という、コンピュータ工学特有の合理的な設計思想を覗いてみましょう。

2の補数を使うと、「7 - 6」を「7 + (-6)」として計算できます。

  1. 「6(0110)」の2の補数は「1010」です。
  2. 0111(7) + 1010(-6) = 10001 となります。
  3. 4ビットの枠からはみ出した「1」を捨てると、結果は「0001(1)」。

このように、「はみ出した桁を捨てる」ことで、引き算の結果が正しく得られます。

この仕組みのおかげで、CPUの回路は非常にシンプルに保たれているのです。

【C言語補足】プログラミングでの実態

対象: C/C++などの低レイヤ言語を扱う人、型によるバグを防ぎたい人。
読み飛ばし: PythonやRubyなど、型をあまり意識しない言語のみを使う人は後回しでOKです。

C言語では、負の数の表現方法は厳密には「処理系依存」とされています。

しかし、現代のほぼすべての環境(x86系やARM系など)では2の補数が「事実上の標準」として採用されています。

これを理解していると、型のサイズ(intやchar)を意識した堅牢なコードが書けるようになり、オーバーフローによる深刻なバグを未然に防ぐことができるようになります。

練習問題:2の補数を手で計算してみよう

電卓とPCで勉強をしているイメージ

知識を「納得」に変える一番の近道は、実際に自分の手で計算してみることです。

ここでは、基本情報技術者試験でもよく問われる典型的なパターンを網羅した練習問題を用意しました。

紙とペンを用意して、一つひとつ手順を確認しながら解いてみてください。

ステップ1:2の補数を求める練習

まずは、正の数から負の数(2の補数)を作る基本手順「ビット反転+1」に慣れましょう。

問題1

問題: 4ビットの2進数で表された「+5(0101)」を、2の補数形式の「-5」に変換してください。

回答: 1011

解説: まず「0101」の全ビットを反転させて「1010」にします(1の補数)。次に、この結果に1を足すと「1011」になります。これが4ビットにおける「-5」の表現です。

問題2

問題: 8ビットの2進数で表された「+10(00001010)」を、2の補数形式の「-10」に変換してください。

回答: 11110110

解説: 8ビットすべてを反転させると「11110101」になります。これに1を足すと、一番下の桁が繰り上がり「11110110」となります。ビット数が増えても手順は全く変わりません。

ステップ2:2の補数から元の数に戻す練習

次に、負の数(ビット列)を見て、それが10進数でいくらを表しているかを確認する練習です。

問題3

問題: 4ビットの2進数「1011」が、2の補数形式で表されている場合、10進数ではいくらになりますか?

回答: -5

解説: 最上位ビットが「1」なので負の数だとわかります。値を調べるために再度「反転+1」を行うと、反転して「0100」、1を足して「0101(5)」となるため、元の値は「-5」であると導き出せます。

問題4

問題: 8ビットの2進数「11110110」が、2の補数形式で表されている場合、10進数ではいくらになりますか?

回答: -10

解説: 8ビットで最上位が「1」なので負の数です。ビット反転して「00001001」、これに1を足すと「00001010」となり、10進数の「10」に対応します。したがって、答えは「-10」です。


ステップ3:減算を「加算」で解く練習

コンピュータの内部で行われている「引き算を足し算で処理する」仕組みを体験しましょう。

問題5

問題: 4ビットの計算「7 - 3」を、2の補数を用いた足し算に変換して計算してください。

回答: 0100(10進数の4)

解説: 「7(0111)」と「-3(1101)」を足します。$0111 + 1101 = 10100$ となりますが、4ビットの器からはみ出した最上位の「1」を捨てると「0100」が残ります。これは10進数の「4」であり、正解です。

問題6

問題: 8ビットの計算「12 - 20」を、2の補数を用いた足し算で計算してください。

回答: 11111000(10進数の-8)

解説: 「12(00001100)」と「-20(11101100)」を足すと「11111000」になります。最上位ビットが「1」なので負の数です。これを「反転+1」で確認すると「00001000(8)」になるため、結果は「-8」であることが分かります。


ステップ4:オーバーフローと表現範囲を意識する問題

最後に、ビット幅の限界(境界値)でどのような挙動が起きるかを確認します。

問題7

問題: 4ビットの符号付き整数において、最大値である「7(0111)」に「1(0001)」を足すと、結果はどうなりますか?また、その数値は何を意味しますか?

回答: 結果:1000、意味:-8

解説: 2進数の足し算として計算すると「1000」になります。しかし、4ビットの2の補数の世界では、最上位ビットが「1」の「1000」は「-8」を意味します。正の最大値に1を足すと負の最小値に飛ぶ、オーバーフローの典型例です。

問題8

問題: 8ビットの符号付き整数において、最大値である「127(01111111)」に「1(0001)」を足すと、10進数としてはどのような値として解釈されますか?

回答: -128

解説: $01111111 + 1 = 10000000$ となります。8ビットの2の補数において「10000000」は負の最小値である「-128」を表します。実務で「合計値を足していったら突然マイナスになった」というバグは、まさにこの仕組みで起こります。

よくある質問10選(FAQ)

Q1:なぜわざわざ2の補数で負の数を表現するのですか?

引き算を加算器で処理でき、回路を最小限にできるからです。

Q2:1の補数じゃダメなんですか?

「+0」と「-0」の二つができてしまい、ゼロ判定の処理が二度手間になるのを防ぐためです。

Q3:2の補数をもう一度2の補数にすると元に戻るのですか?

はい、戻ります。

「ビットを反転して1を足す」という操作を2回繰り返すと、元の正の数に戻ります。このため、コンピュータは符号の反転を同じ手順で行えます。

Q4:2の補数で表現できない負の数はありますか?

そのビット幅の「範囲外」の数値は表現できません。

たとえば4ビットなら「-9」以下は表現できません。また、負の最小値(-8)に対応する正の数(+8)が存在しない点にも注意が必要です。

Q5:符号付き整数と符号なし整数の違いは、2の補数とどう関係しますか?

ビット列の「解釈のルール」が違うだけです。

メモリ上の「1111」を、符号なしなら「15」、符号付き(2の補数)なら「-1」と読み取ります。

Q6:オーバーフローするとき、値はどう解釈すればいいですか?

数直線が「円」のように繋がっていると解釈してください。

最大値「7」に1を足すと「-8」にループします。この挙動がバグの原因になることがあります。

Q7:2の補数を取るときのビット数はどう決めればいいですか?

扱うデータの型(型サイズ)によって決まります。

4ビット、8ビット、32ビットなど、計算前に「何ビットの器か」を確定させる必要があります。

Q8:試験でよく出る「2の補数」の典型パターンは何ですか?

10進数と2進数の相互変換、および表現範囲の計算です。

「-10を8ビットの2の補数にせよ」といった問題が定番です。

Q9:プログラミング初心者はどこまで理解しておけば十分ですか?

「正の最大値を超えるとマイナスに化ける」というリスクを知っていれば合格点です。

これが分かっていれば、数値が異常な挙動を示した際にすぐ原因に気づけます。

Q10:2の補数の理解を深めるおすすめの練習方法は?

4ビット程度の小さな数で、引き算を「補数の足し算」で解いてみることです。

「3 - 1」を足し算で解き、答えが「2」になることを手書きで確認すると、知識が納得に変わります。

<関連コラム>

ITパスポート取得のメリット・初心者にオススメの理由を紹介!

応用情報技術者試験について解説!基本情報技術者試験との違いは?

R言語について徹底解説!PythonやC言語との違いは?役立つ資格やおすすめ本もご紹介

toiroフリーランスはフリーランスエンジニア向けのSHIFTグループ案件・求人情報サイトです。

プライムベンダーだからこそ、商流が深い多重下請けや不要な中抜きは一切なく、
高単価適正単価で業務委託案件をご案内しています。

アカウント登録後には、さまざまなサービスや機能を無料でご利用いただけます。

  • 登録面談にてキャリア相談や案件マッチングのコツ、市場トレンドや耳寄りな情報をお伝えします
  • 本サイトでは公開していない非公開案件をすべて確認可能
  • ご希望条件に合うエージェントおすすめの案件を随時ご案内

個人事業主やフリーランスで活躍されている方、これから目指している方、少しでもご興味がある方はぜひお気軽にお問い合わせください!