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進数
01080x8
0100640x40
010005120x200
01000040960x1000
0100000327680x8000
010000002621440x40000

さらにいうと

ソースコードによく出てくる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ともども苦労したそうである。 先達も歩んだ道だ、と思うと多少は心もなごもうというものである。

結論

というわけで、「はず」と思って結果を求めてもなかなかうまくいかない。 そもそも人生とはそういったものである。 人間、新しい概念に慣れるまで時間がかかるのは当然のことである。 頭の中で熟成するのを待つべし。
戻る