0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🤖 コンピュータはこうやって負の数を扱ってる!2の補数超入門 🔑

Posted at

2の補数を完全理解:符号付き数値表現の仕組み

私は現在、基本情報技術者試験の取得を目指しており、前回の2進数に関する記事に続いて、今回は「2の補数」について詳しく解説していきます。

2の補数は、コンピューターが負の数を表現するために使用する重要な仕組みです。「なぜ負の数を特別な方法で表現する必要があるのか」「通常の2進数との違いは何なのか」といった疑問を抱いていましたが、学習を進める中で、これがコンピューターの算術演算を効率化する巧妙な仕組みであることが分かりました。

基本情報技術者試験では、2の補数に関する問題が頻出されるため、この概念をしっかり理解することは非常に重要です。

目次

はじめに

普段の生活では、負の数を表現するときに単純にマイナス記号「-」を使います。しかし、コンピューターの世界では0と1しか扱えないため、負の数を表現するには特別な工夫が必要です。

実際に学習を進めてみると、2の補数という表現方法が、加算と減算を同じ回路で処理できるという大きなメリットがあることを学びました。

コンピューターが2の補数を使う理由

  1. 加算と減算を同じ回路で処理可能
  2. オーバーフロー(計算結果が表現できる範囲を超えてしまうこと)の検出が簡単
  3. 0の表現が一意(ただ一つ)
  4. 算術演算(足し算や引き算などの計算)の効率化

補数とは何か

補数とは、ある数に足すと特定の値になる数のことです。コンピュータは補数を使って引き算を足し算に変換して計算しています。

どの進数でも、基数(10進数なら10、2進数なら2のような基準となる数)に基づいて2種類の補数が存在します。

  • 基数-1の補数:各桁を最大値から引いた値
  • 基数の補数: 基数-1の補数に1を加えた値

10進数での補数

9の補数(基数-1の補数)

9の補数は、その数に足して「9」になる値です。

1の9の補数   = 9 - 1     = 8  
123の9の補数 = 999 - 123 = 876

10の補数(基数の補数)

10の補数は、その数に足して「10」になる値です。

1の10の補数   = 10 - 1     = 9  
123の10の補数 = 1000 - 123 = 877

関係式:10の補数 = 9の補数 + 1

2進数での補数

5を4ビットで表現して補数をみてみましょう。

1の補数(基数-1の補数)

各ビットを反転させます(0→1、1→0)

5の2進数: 0101
1の補数:  1010  

2の補数(基数の補数)

1の補数に1を加えます。

5の2進数: 0101
1の補数:  1010  (各ビットを反転)
2の補数:  1011  (1の補数 + 1)

コンピュータでの負数表現

コンピュータは2の補数を使って負の数を表現します。
これにより、減算を加算として処理できます。

例:-5を4ビットで表現

5の2進数: 0101
1の補数:  1010
2の補数:  1011  → これが-5の表現
5 + (-5) = 0101 + 1011 = 10000
※最上位の1は桁あふれして消える → 0000 = 0

このように、コンピュータは「5 - 5」を「5 + (-5)」として足し算で計算しています。

検証:5 - 3 = 2 を検証(4ビット)

5 - 3 = 5 + (-3)

5の2進数:    0101
3の2進数:    0011
-3の2の補数: 1101

計算:
  0101  (+5)
+ 1101  (-3)
-------
 10010  = 0010 (桁あふれを無視) = 2

結果:5 - 3 = 2 ✓

符号ビットの概念

符号ビットとは

符号ビットは、数値の正負を表すビットです。2の補数表現では、最上位ビット(1番左のビット)が符号ビットとなります。

符号ビットの規則

符号ビット = 0 → 正の数
符号ビット = 1 → 負の数

ビット幅と表現範囲

ビット幅によって表現できる数値の範囲が決まります。

4ビット符号付き整数の場合

符号ビット: X XXX
           ↑ 符号  数値部分
           0 → 正  1 → 負

表現可能な範囲

最大値: 0111 = +7
最小値: 1000 = -8
範囲: -8 ≤ n ≤ +7

8ビット符号付き整数の場合

範囲: -128 ≤ n ≤ +127
最大値: 01111111 = +127
最小値: 10000000 = -128

nビット符号付き整数の一般的な範囲

範囲: -2^(n-1) ≤ 数値 ≤ 2^(n-1) - 1

通常の2進数と2の補数の違いと見分け方

表現方法の違い

通常の2進数(符号なし)

  • すべてのビットが数値を表現
  • 負の数は表現できない
  • 0 ≤ 数値 ≤ 2^n - 1

2の補数(符号付き)

  • 最上位ビットが符号を表現
  • 正の数と負の数の両方を表現可能
  • -2^(n-1) ≤ 数値 ≤ 2^(n-1) - 1

同じビットパターンでも意味が異なる例

4ビットの場合の比較表

ビット 符号なし 2の補数
0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 -8
1001 9 -7
1010 10 -6
1011 11 -5
1100 12 -4
1101 13 -3
1110 14 -2
1111 15 -1

見分け方のポイント

ポイント1:最上位ビットを確認

0XXX → 正の数
1XXX → 符号なしなら正の数、2の補数なら負の数

ポイント2:文脈から判断

- 問題文の記述
- 取り扱う数値の範囲

ポイント3:計算結果の妥当性

例:1000(4ビット)の場合
符号なし解釈: 8
2の補数解釈: -8

文脈に応じて適切な解釈を選択

2の補数の計算方法まとめ

基本的な計算手順

例:-6を4ビットで表現

手順1: 6の2進数表現
6 = 0110

手順2: 各ビットを反転(1の補数)
0110 = 1001

手順3: 1を加える
1001 + 0001 = 1010

結果:-6 = 1010

符号ビットを考慮した2進数から10進数への変換

正の数の場合(符号ビット = 0)

通常の2進数と同じ方法で計算します。

例:0101
= 0×2³ + 1×2² + 0×2¹ + 1×2⁰
= 0 + 4 + 0 + 1
= 5

負の数の場合(符号ビット = 1)

方法1:2の補数を求めてから符号を反転

例:1010(4ビット)

手順1: 2の補数を求める
1の補数: 1010 = 0101
2の補数: 0101 + 0001 = 0110

手順2: 10進数に変換
0110 = 6

手順3: 符号を反転
結果:-6

方法2:重み付き加算(符号ビットを負の重みとして計算)

例:1010(4ビット)

1×(-2³) + 0×2² + 1×2¹ + 0×2⁰
= 1×(-8) + 0×4 + 1×2 + 0×1
= -8 + 0 + 2 + 0
= -6

計算例とコツ

計算例:8ビットでの計算

問題:-25を8ビット2の補数で表現する

手順1: 25の2進数表現
25 = 16 + 8 + 1 = 2⁴ + 2³ + 2⁰
25 = 00011001

手順2: 1の補数
00011001 = 11100110

手順3: 1を加える
11100110 + 00000001 = 11100111

結果:-25 = 11100111

検証

11100111の10進数変換
1×(-128) + 1×64 + 1×32 + 0×16 + 0×8 + 1×4 + 1×2 + 1×1
= -128 + 64 + 32 + 4 + 2 + 1
= -128 + 103
= -25 ✓

計算を速くするコツ

コツ1:よく使う値を暗記

4ビット2の補数でよく出る値
-1 = 1111
-2 = 1110
-3 = 1101
-4 = 1100
-5 = 1011
-6 = 1010
-7 = 1001
-8 = 1000

コツ2:最小値・最大値を覚える

nビット2の補数の範囲
最小値: -2^(n-1)    ビットパターン: 1000...000
最大値: 2^(n-1) - 1 ビットパターン: 0111...111

4ビット: -8 ≤ n ≤ 7
8ビット: -128 ≤ n ≤ 127
16ビット: -32768 ≤ n ≤ 32767

コツ3:検算方法

正しく変換できているかの確認方法

1. 元の数と2の補数を加算 → 0になることを確認
2. 2の補数から10進数への逆変換で確認
3. 符号ビットの確認(正なら0、負なら1)

よくある間違い

間違い1:符号ビットの誤解

× 誤:最上位ビットが1は、必ず負数

○ 正:2進数の補数表現において、負数は最上位ビットが1

間違い2:2の補数の求め方の誤り

× 誤:-5 = 5の符号ビットを1にする
     0101 → 1101

○ 正:-5 = 5の2の補数
     0101 → 1010(1の補数) → 1011(2の補数)

間違い3:ビット幅の考慮不足

× 誤:ビット幅を考えずに計算
○ 正:指定されたビット幅での計算

例:-1を表現
4ビット:  1111
8ビット:  11111111
16ビット: 1111111111111111

まとめ

2の補数は、コンピューターにおける負数表現の基盤であり、基本情報技術者試験でも頻出する重要な概念です。学習のポイントは以下の通りです。

  • 基本概念

    • 2の補数は負数を表現するための仕組みで、加減算を統一的に処理できる
    • 2進数の補数表現において、負数は最上位ビットが1
    • nビットでの表現範囲は -2^(n-1) から 2^(n-1)-1 まで
  • 計算方法

    • 負数の2の補数表現:元の数値のビットを反転させ、1を加える
    • 正数から負数、負数から正数への変換は同じ手順で行える
    • 2進数の補数から10進数への変換は、符号ビットを負の重みとして考慮
    • 検算の習慣を持ち、元の数と2の補数の加算結果が0になることを確認
  • 実践的なコツ

    • 頻出する値のビットパターンを暗記しておく
    • 符号なし表現と2の補数表現の違いを見分ける

初学者にとっては複雑に感じられるかもしれませんが、手を動かして計算し、基本原理を理解することで確実に身につきます。特に「ビットの反転+1」という基本操作と、符号ビットの概念をしっかり押さえることが重要です。

この記事の内容に誤りがあればコメントでご指摘いただけますと幸いです。また、2の補数の理解を深めるための効果的な学習法など、皆様の経験に基づく知見をぜひ共有していただければと存じます。特に「2の補数を直感的に理解するためのたとえ話」や「計算を簡略化するテクニック」など皆様の知見をお聞かせいただければ幸いです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?