4 / 8 / 16 / 32 ビットそれぞれで、2の補数表現の符号付き整数が表せる範囲を数直線で比較します。負の側が1つ多いという特徴も確かめましょう。
符号付き整数の表現範囲とは、決められたビット数で表せる負の数を含む整数の範囲のことです。コンピュータでは2の補数表現を使うため、範囲には特徴的なパターンがあります。
公式はとてもシンプルです。
・最小値: -2^(n-1)
・最大値: 2^(n-1) - 1
・値の総数: 2^n(負・0・正をすべて含む)
たとえば8ビットでは、-128 〜 +127 の256通りを表せます。0 を中心に左右対称ではなく、負の側が1つ多いのがポイントです。これは2の補数の都合で、後のカードで詳しく説明します。
ビット数を1つ増やすたびに、表せる値の総数が2倍になります。範囲は左右両側に等しく広がるので、ビット数を倍にすると見える世界の大きさはとても急速に伸びていきます。
| ビット数 | 最小値 | 最大値 | 値の総数 | 主な用途 |
|---|---|---|---|---|
| 4 bit | -8 | 7 | 16 | 16進数1桁、教材用 |
| 8 bit | -128 | 127 | 256 | 1バイト、文字コード、画素値 |
| 16 bit | -32,768 | 32,767 | 65,536 | 音声サンプル、short型 |
| 32 bit | -2,147,483,648 | 2,147,483,647 | 約42億 | int型、Unix時刻(2038年問題) |
代表的な2の冪は次のとおりです。
・2⁷ = 128, 2⁸ = 256, 2¹⁵ = 32,768, 2¹⁶ = 65,536
・2³¹ = 約21億, 2³² = 約42億(メモリ容量・int型の範囲計算で使う)
覚えておきたい関係:
・nビットで表せる符号付き整数の最小値は -2^(n-1)、最大値は 2^(n-1) - 1
・ビット数を1つ増やすと、表現範囲は2倍になる
・Unix時刻が2038年で問題になるのは、32ビットint型の上限 2,147,483,647 に到達するため
「負の側が1つ多い」のはなぜ? ビット列のパターンは全部で 2^n 通りあります。そのうちの1つは「0」を表すために使われるため、残りの 2^n - 1 個を負と正に分けます。0 を「正側」に分類するルールにすると、負の側だけが「0を含まない」ので、絶対値の最大が1だけ大きくなるのです。
この性質から、「最小値の符号を反転しようとすると、最大値を超えてしまう」という小さなトラップがあります。8ビットでは -(-128) = 128 ですが、127 が最大なので、結果がオーバーフローを起こします。これはプログラミングで引っかかりやすいポイントです。