bit と 2 進接頭辞の変換

最近 "64bit" て言葉をよく聞くし実際動いてるモノも普通に見かけるようになってきたんだけどそれがどのくらいの数を扱えるのか感覚としてわかっておきたい、みたいな。ある architecture でどの程度の primary memory を扱えるのかとか overflow させないために必要な容量の算定とかに使う。

とりあえず前提として以下の表にあげてある計算はパッとできないとツライんだけども。

20 1
21 2
22 4
23 8
24 16
25 32
26 64
27 128
28 256
29 512
210 1024

もひとつ、単位の大きさも Ei あたりまでは覚えておかないとダメかも。小さい方から Ki, Mi, Gi, Ti, Pi, Ei みたいに順番に言えるようになれば問題ない。

210 Ki
220 Mi
230 Gi
240 Ti
250 Pi
260 Ei
270 Zi
280 Yi

でまぁ具体的に 210 = 1024 = 接頭辞の変わり目ということを利用して実際の数を計算する。 16bit を例に挙げると 216 = 26 * 210 = 64Ki という形。接頭辞で誤魔化してるんだけど感覚としてはわかるよね。

ちゃんと計算するとなると 1024 ってけっこうめんどい数字なので 1000 で近似してしまうとか。まぁほんとに rough なハナシするときにしか使えないんだけど。

で、ここらへん加味して有名どころを列挙すると以下のようになる。 128bit とか単位足りないんだけど…。

bit primary prefix raw
8bit 28 = 256 256
16bit 26 × 210 = 64Ki 65,536
32bit 22 × 230 = 4Gi 4,194,304
64bit 24 × 260 = 16Ei 18,446,744,073,709,551,616
128bit 28 × 240 × 280 = 256 Ti × Yi 3.4028236692093846346337460743177e+38

とまぁ、 1 word が 32bit な machine の場合は C 言語の int で 4Gi 個の数を扱えるとか Windows XP は 32bit OS なので 4GiB の memory しか扱えないとか。そう考えると 64bit Windows 7 で 192 GiB しか memory が扱えないのは少ないような気がしてくるね。理論上は 16EiB まで addressing できるんだけど何か他に制限があるのかも。

あーここらへんは 1 word で memory adrressing してるという前提のハナシね。やっぱり C 言語の例だけど pointer 型の大きさが 1 word というのもわかりやすいしそれだけで済むというのは狙って設計したからなのかなと思ってしまう。 MS-DOS の memory addressing とか知ってるとなおさら。 16bit OS なのに 1MiB の memory を管理できた、というのは有名だけど仕組みとしてはけっこうめんどくさかったよなぁ。