情報学基礎 / 第 5 回

情報の表現(2)

基数変換、負の数(補数)、小数(浮動小数点数)

この回のねらい

なぜ 2 進数なのか

コンピュータのハードウェアは半導体、すなわちトランジスタ回路(電気的なスイッチ回路)の集まりです。 スイッチに電流が流れていない(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
0〜15 の対応表(これは覚えてしまうのが早い)
10進01234567 89101112131415
2進00000001001000110100010101100111 10001001101010111100110111101111
16進01234567 89ABCDEF

基数変換

下の道具は、変換の途中の計算まで見せます。数を入れ替えて、手で解くときの手順を確かめてください。

基数変換ツール入力できます

2 進数 ⇔ 8 進数・16 進数は「区切るだけ」

8 = 23、16 = 24 なので、 2 進数を下から 3 桁ずつ区切れば 8 進数、4 桁ずつ区切れば 16 進数になります。 いちいち 10 進数を経由する必要はありません。

区切って読む入力できます

負の数の表し方 ── 補数

4 ビットあれば 16 通りの表現ができます。この 16 通りを、正の数だけでなく負の数にも割り当てようというのが補数の考え方です。

まず「1 の補数」でやってみると

各ビットを反転させたものを負の数に割り当てます(これが1 の補数)。 ところがこれだと 0 が 2 か所(0000 と 1111)できてしまいます。

そこで「2 の補数」

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)。

2 の補数を作るビットをクリック
ビット幅と表せる範囲(2 の補数)
ビット幅表現の総数表せる範囲
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 つに分けて記録します。

単精度浮動小数点数(32 ビット)
部分ビット数中身
符号部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

単精度浮動小数点数に直す入力できます
← 第4回 情報の表現(1) 第6回 情報通信ネットワーク(1) →