コンピュータのハードウェアは半導体、すなわちトランジスタ回路(電気的なスイッチ回路)の集まりです。 スイッチに電流が流れていない(off)を 0、流れている(on)を 1 とし、 この 0 と 1 だけで表現される数を2 進数といいます。 2 進数と 10 進数、一般化した N 進数は相互に変換できます。
それぞれの桁には重みがあります。重みは基数の累乗です。
| 記法 | 使う数字 | 重み | 例 |
|---|---|---|---|
| 2 進数 | 0, 1 の 2 種類 | 2n | (1011)2 = 1×23+0×22+1×21+1×20 |
| 8 進数 | 0〜7 の 8 種類 | 8n | (35)8 = 3×81+5×80 |
| 16 進数 | 0〜F の 16 種類 | 16n | (2F)16 = 2×161+F×160 |
| 10進 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2進 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
| 16進 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
下の道具は、変換の途中の計算まで見せます。数を入れ替えて、手で解くときの手順を確かめてください。
8 = 23、16 = 24 なので、 2 進数を下から 3 桁ずつ区切れば 8 進数、4 桁ずつ区切れば 16 進数になります。 いちいち 10 進数を経由する必要はありません。
4 ビットあれば 16 通りの表現ができます。この 16 通りを、正の数だけでなく負の数にも割り当てようというのが補数の考え方です。
各ビットを反転させたものを負の数に割り当てます(これが1 の補数)。 ところがこれだと 0 が 2 か所(0000 と 1111)できてしまいます。
1 の補数からひとつずつずらす、つまり各ビットを反転して +1 する。 これが2 の補数です。0 がひとつになり、4 ビットで −8 〜 7 を表せます。
補数(complement)は基数の考え方から来ています。
10 進数の場合:9 の補数(基数−1 の補数)は各桁を 9 から引いたもの(42 ⇒ 57)。
10 の補数(基数の補数)は 9 の補数に +1 したもの(42 ⇒ 58)。
2 進数の場合:1 の補数は各桁を 1 から引いたもの=各ビットの反転(1010 ⇒ 0101)。
2 の補数は 1 の補数に +1(1010 ⇒ 0110)。
| ビット幅 | 表現の総数 | 表せる範囲 |
|---|---|---|
| 3 ビット | 23 = 8 通り | −4 〜 3 |
| 4 ビット | 24 = 16 通り | −8 〜 7 |
| 5 ビット | 25 = 32 通り | −16 〜 15 |
| 16 ビット | 216 = 65,536 通り | −32,768 〜 32,767 |
| 32 ビット | 232 通り | −231 〜 231−1 |
だいたい半々に分かれます。負の側が 1 つ多いのは、0 が正の側に入っているからです。
小数点の位置をあらかじめ固定してしまう方式です。単純ですが、 扱える大きさの幅(ダイナミックレンジ)が狭くなります。
小数点の位置を動かせるようにした方式です。
2 進数を 1.xxxxx × 2n の形(正規化)に直し、
符号部・指数部・仮数部の 3 つに分けて記録します。
| 部分 | ビット数 | 中身 |
|---|---|---|
| 符号部 | 1 ビット | 正なら 0、負なら 1 |
| 指数部 | 8 ビット | 実際の指数にバイアス 127 を足した値 |
| 仮数部 | 23 ビット | 正規化した数の、整数部の 1 を除いた小数部(残りは 0 で埋める) |
教科書の例:11.1875 を単精度で表す。
2 進数にすると (1011.0011)2 ← (1011)2=11、(.0011)2=0.125+0.0625=0.1875
正規化すると (1.0110011)2 × 23 → 仮数部 1.0110011、指数 3
符号部=0(正)、指数部=3+127=130=(10000010)2、仮数部=0110011 に 0 を詰める
結果:0 10000010 01100110000000000000000