ソフトウェアは私たちに幸福をもたらすことができるのか

知ってた?8進数のナゾ

»

 C、Java、JavaScriptなどで、「0123」という数はどういう意味でしょうか。プログラマーであれば、これが8進数の「123」で、10進数で「83」(1×82+2×81+3)という数値だということは常識です。では、なぜ0から始まると8進数ということになっているのか?

 実は、今週の社内勉強会の中でこの疑問が出て、残念ながら参加者の中にこの疑問に答えられる人がいませんでした。そこで、Webでわかる範囲で調べてみた結果わかったのが以下のことです。

なぜ8進数が必要だったのか?

 さて、この答えにたどり着くには、まず「そもそもなぜ8進数が必要だったのか?」ということを理解しなければなりません。

 これは、コンピュータの歴史に遡ります。実は、その昔、コンピュータの処理ビット数は3の倍数が普通でした。たとえば、IBMの70xシリーズや70xxシリーズは36bit機(例:701, 7094) 、DECのPDP-7は18bit機、PDP-8は12bit機(参考)、UNIVAC 1000は24bit機(参考)など。そして、アドレッシングは15ビットだったりしてインストラクションを3ビット単位で考えることが多かった(参考)。ということで、ビット3桁でくくるのが都合がよかった。また2進3桁であれば、0-7なので、数字の範囲で処理できるので好都合です。

なぜ0をつけると8進数としたのか?

 まず、普通の数字、たとえば「1」, 「12」, 「123」などは10進数です。8進数の「1」, 「12」, 「123」という数字があったとしてこれらを8進数として明確に区別するには、算数では「1(8)」, 「12(8)」, 「123(8)」と表記します。しかし、下付き文字はテキストベースでは使えないし「1(8)」, 「12(8)」, 「123(8)」などと書くと意味が紛らわしい。しかも、数字を一旦バッファリングしたあとに3文字を読んで初めて8進数とわかるのも処理上はコスト高となって、Assemblerなどの低級言語、しかもメモリが限られているなど効率が重視される状況では都合の悪い実装となってしまいます。

 つまり都合がいいのは、後で判別できるのではなく、先に8進数だということが判別できること。そのためには「1」, 「12」, 「123」の前に何か識別子をつけるということになります。そして、処理コストを考えると、それは1文字の方がいい。

 そうなると、「じゃあOctalの1文字をとって"o"をつけることにしよう」という発想が出てくると思います。つまり、「o1」, 「o12」, 「o123」と書くと8進数ということです。これはこれで明快です。

 しかし、コンピュータでの処理を考えたときはどうでしょう。処理プログラムがある文字列を渡されたときに、先頭が「o」であれば、その次に続く文字をみて8進数かどうかを判断しないといけません。なぜなら、「o123」ではなく「ooimachi」という文字列かもしれないから。もちろん、これでも処理できますが、もっと賢い処理の仕方はないでしょうか?

 そこで、誰かが思いついたのが先頭に「0」を使うことです。普通の10進数では、数値0以外で先頭に0がくることはありません。また、10進数でも8進数でも0は0です。だから、最初に0が来たら8進数と断定することができて、処理コストも下がります。その後16進表記(0x)なども出て、0で始まるから8進数とは言えなくなっていますが、最初に思いついた人は頭いいですね。

いつから使われ始めたのか

 上記のような背景から考えると、0で始まる8進数は、初期メインフレームのAssemblerで使われ始めたと考えるのが自然だと思います。しかし、Web上の文献の範囲だと1960年代後半に開発されたB言語(C言語の親に当たる)でそれが使われていたというところまでしか遡れませんでした。以下、B言語の仕様から抜粋。

An octal constant is the same as a decimal constant except that it begins with a zero.

8進数は人間界にも存在した!

 ところで、8進数はコンピュータ独特のものと思っていたら、WikipediaのOctalの項には、なんとアメリカやメキシコの一部では実際に8進数が使われていると書かれています。しかも、その由来は「指を数える」のではなく「指の股を数える」のだからだそうです。なるほど!(笑)

The Yuki language in California and the Pamean languages in Mexico have octal systems because the speakers count using the spaces between their fingers rather than the fingers themselves.

Comment(1)

コメント

Hirano, Yasuhiro

>コンピュータの処理ビット数は3の倍数が普通でした。
実際は、6bitの倍数が正しいですね。(アドレスバスが15bitという例は、データバス幅とは違う次元の話ですから)
では何故6bitの倍数かというと、「アルファベット(大文字のみ)と数字と若干の記号を表現するのに6bitで十分だったから」と聞いたことがあります。1bitでもメモリを節約したい時代、8bitの倍数だとテキスト処理をするときに無駄が多かったのでしょう。

コメントを投稿する