IT用語を超やさしく理解する
符号付き数と補数
別名: 符号付き整数 / 補数 / 2の補数 / two's complement
先に知っておくと分かりやすいことば(1語)
必要なら先に確認できます。知っていることばは、そのまま読み進めて大丈夫です。
- 2進数2進数の桁が1、2、4、8…の重みを持つことと、10進数との基本的な変換方法を初心者向けに説明します。
30秒で思い出す
コンピュータで負の整数を表す代表的な方法が 2の補数 です。
n bitの2の補数では、最上位bitが0なら0以上、1なら負の値を表し、範囲は -2^(n-1) 〜 2^(n-1)-1 になります。
超やさしく理解
4bitで10進数の5を表すと 0101 です。
この5を負の数 -5 として表したいときは、2の補数では次の手順を使えます。
+5 0101
0と1を反転 1010
1を足す 1011
したがって、4bitの2の補数表現では 1011 が -5 を表します。
正確にはどういうもの?
2の補数表現では、n bitの各bitに通常の2進数と少し違う重みを考えられます。
4bitなら、
bitの重み -8 4 2 1
1 0 1 1
なので、
-8 + 0 + 2 + 1 = -5
となり、1011 が -5 だと直接読み取れます。
最上位bitが1なら「残りのbitがそのまま絶対値」という意味ではありません。2の補数ではbit列全体で値を表します。
なぜ2の補数を使う?
正の数と負の数を同じ加算回路で扱いやすいからです。
4bitで +5 と -5 を足してみます。
0101 (+5)
+ 1011 (-5)
------
1 0000
4bitの範囲では、最上位bitより左へ出た繰り上がり(carry)を捨てるため、結果は 0000、つまり0になります。
このように、減算を「負の数を足す」として扱いやすいことが2の補数の大きな利点です。
どこで使う?
符号付き整数をbit列として保存し、加減算するときの基本的な考え方として使われます。
デバッガやバイナリデータで同じbit列を見ても、符号なし整数として読むか2の補数の符号付き整数として読むかで値は変わります。bit列だけでなく、どの形式として解釈するかが必要だと理解することが重要です。
2の補数を作る
n bitの正の値から負の値を作る基本手順は、
- 0と1を反転する
- 1を足す
です。
たとえば8bitの 00000101(+5)なら、
00000101
↓ 反転
11111010
↓ +1
11111011
なので 11111011 が -5 です。
負の2の補数から値を読む
最上位bitが1なら負数です。
たとえば8bitの 11111011 を読むときは、
- 0と1を反転 → 00000100
- 1を足す → 00000101
- 10進数では5
- 元は負数なので -5
と考えられます。
表現できる範囲
n bitの2の補数で表せる整数は、
-2^(n-1) 〜 2^(n-1)-1
です。
| bit数 | 最小値 | 最大値 |
|---|---|---|
| 4bit | -8 | 7 |
| 8bit | -128 | 127 |
正の側より負の側が1つ多いのは、0を1通りだけで表し、最上位bitの重みが負になるためです。
よくある勘違い
最上位bitが1なら、残りのbitが絶対値?
2の補数では違います。最上位bitは負の重みを持ち、bit列全体で値を表します。
0と1を反転するだけで2の補数になる?
反転したものは1の補数です。2の補数にするには、さらに1を足します。
2の補数ならどんな大きさの整数でも表せる?
bit数が固定されているため範囲があります。範囲を超える計算で起きるオーバーフローの詳細は別Knowledgeで扱います。
このKnowledgeで扱わないこと
ここでは整数の符号と2の補数を扱います。
固定小数点、浮動小数点、丸め誤差、オーバーフロー判定の詳細は後続Knowledgeへ分けます。
ここまで分かればOK
- 2の補数が負の整数を表す代表的な方法だと説明できる
- 正の2進数から2の補数を作れる
- 負の2の補数表現を10進数へ読み替えられる
- n bitで表せる範囲が -2^(n-1) 〜 2^(n-1)-1 だと分かる
- 最上位bitを単純な符号と絶対値に分けて読まない
資格との関係
基本情報技術者試験
- シラバス
- Ver.9.2
- 必要な理解
- 問題で応用できる
- 重要度
- 高
- 分野
- テクノロジ
関連するIT用語
理解できたか確認しよう
答えを選んで、なぜそうなるのかまで確認できます。
確認問題 1
8bitの符号付き整数を読む
ある処理で8bitの符号付き整数が11111011として記録されていました。この値は2の補数表現です。
このbit列が表す10進数として最も適切なものはどれですか?
確認問題 2
4bitで-5を表す
4bitの2の補数表現で、10進数の-5を表すbit列はどれですか?