8進数
UNIX第6版のソースコードでは8進数が多用されているが、
これがなかなか手ごわい。
筆者が普段、数として扱っているのは10進数や16進数がほとんどである。
2進数も出てくることはあるが、これは数というよりbit列としてである。
C言語と8進数
Cでは先頭が0で始まる数は8進数、
という規約を読んで「そんなもの使わないってば」と思ったのは15年ほど前のことである。
実際、普段はCで8進数を使うのはESC文字が「\033」など、ごく限られた慣用表現のみである。
16進数は0xというややこしい接頭辞がつくのに対して、
8進数の表現のほうが簡単なのは、
C言語にとって後者がネイティブであったことを反映しているのであろう。
要するに
数字をみてぱっと量としてとらえられるかどうか、である。
8進数 | 10進数 | 16進数 |
010 | 8 | 0x8 |
0100 | 64 | 0x40 |
01000 | 512 | 0x200 |
010000 | 4096 | 0x1000 |
0100000 | 32768 | 0x8000 |
01000000 | 262144 | 0x40000 |
さらにいうと
ソースコードによく出てくる01777777などが「キリのいい数-1」というあたり、
感覚としてとらえられるとよいのだが、これも案外難しい。
こういう感覚というのはいくら「わかるはず」と思っていても、
16進数や10進数に慣れきった頭はそう簡単には切り替わらない。
16進数に直してしまえ
8進数が面倒なら16進数に書き換えてしまえばいいではないか、と思うのは当然の発想である。
が、PDP-11ではあまりうまくない。というのも、
仮想空間は0200000byteでありこれが020000byteごとの010個の空間に分割されていて、
0100ページ単位で実記憶から割り当てることができる、
というぐあいにPDP-11は世界が8進数なのである。
これを16進に変換すると、
仮想空間は0x100000byteでありこれが0x2000byteごとの0x8個の空間に分割されていて、
0x40ページ単位で実記憶から割り当てることができる、
となってしまってもとの美しさが失われてしまう。
UNIXのソースコードに直接関係するわけではないが、
機械語命令のコードも同様である。
レジスターが8個あるなど、プロセッサのデザインにおいて8が基調となっているので、
8進数ならきれいに書けるのだが16進数だとわかりにくい。
実は、PDP-11のデザインに影響を受けているモトローラの68000シリーズでも同様である。
苦労しているのは君だけではない
YACCおよびPortable C Compilerの作者であるStephen C JohnsonのUSENIX98での話によると、
8進数から16進数の環境に移ったときはDennis Ritchieともども苦労したそうである。
先達も歩んだ道だ、と思うと多少は心もなごもうというものである。
結論
というわけで、「はず」と思って結果を求めてもなかなかうまくいかない。
そもそも人生とはそういったものである。
人間、新しい概念に慣れるまで時間がかかるのは当然のことである。
頭の中で熟成するのを待つべし。
戻る