タコの足は8本! イカは10本!! (じゃあムカデは?)

つるかめ算の話ではない。8進数の話。

C言語の設計ミスの大きな部分を占めているのは「0ではじまる整数を8進数とみなす」ところにあると思う。それでいて0.1は10進数の浮動小数点数なのだ。0ではじまれば8進数、という単純な話じゃなくて、整数という呪いがかかっている。しかもatoi()一発では取れないのが情けないという。うんざりだ。そういうわけで、例えばC言語のプログラマは「09:00起床」というメモを書けなくなってしまう。09はダメだよ。あっという間にエラーだ。8進数に9て。いい子は9時に起きたきゃ「011:00起床」と書きなさい(おいおい)。

従順なプログラマの誰もが反攻の狼煙を上げないまま、世界がそういう常識になってしまった。

今から作るとしたら、何もなければ普通に10進数で、0bではじまれば2進数、0xではじまれば16進数、0oではじまれば8進数、0dではじまれば10進数、0a(n)ではじまればn進数、浮動小数点数も同じ扱い、とするのが正しいと思う。つまり、16進数で256と書こうとした例だと、、、

0x100 = 0a(16)100 = 0a(0x10)100 = (int)0x100.0 = (int)1e0x2 = (int)1e0a(16)2

という感じ(最後のほうは異様にわかりにくいかな)。時計に12進数や60進数も書ける。60進数は文字の関係で現実的にはあんまり書けそうにないが、例えば2時間は何分? ってときに0a(60)20 = 120分だし、何秒? ってときは0a(60)200 = 7200秒にできる。1GiB = 0a(1024)1000だ。

最初に0をつけるというのが残ってしまうが、これは数値か変数かを見分ける必要があるので、前置きで判別する場合はしょうがないかなと思う。最後につけるのがサイズ(というか型か)というのも誤解の元になるのだが、それは残してあげようかな。

…これ、プリプロセッサのレベルでできるよなぁ。どうしよう(やってみちゃうわけがないけど(笑))。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です