新・闘わないプログラマ No.363

○進数


普段なにげなく使っている言葉も、よくよく考えてみると実は、誤った、もしくは誤解を招く表現だったりすることは多々あります。こうやって駄文を公開していたり、さらに本まで書いちゃったりしていると、そういうことには敏感にならないといけないな、と思ったりもするのですが、注意していてもついつい使っちゃうとか、全然気付かすに使っちゃう変な表現というのは結構あります。

さて先日、結城さん「2進数と2進法」という日記を読みました。その日記およびリンク先を読んで、考えるところ大でありました。
「2進数」「10進数」と呼ぶと、確かにそれらは別々の種類の「数」のように見えますね。2進数の「1010」と、10進数の「10」はどちらも数(値)としては同じものであるわけで、単に表記が違っているだけなのですから、「2進法」「2進表現」や「10進法」「10進表現」と呼ぶべきだというのは、その通りだと思います。今までまったく疑問にも思わずに使っていました。
さて、「○進数」「○進法」を英語だとどう表現するのか、辞書を頼りに確かめてみると、

と、なるようです。辞書的には“binary”は名詞でもあって「2進数」という訳語が載っています。でも私の乏しい英語読みの経験では、“binary number”と同じ意味というよりは“binary notation”と同じような意味で使われていることのほうが多いように感じられます。

「こんなの、どう呼んだって、わかればいいじゃん」という意見もあるかと思いますが、以前、新入社員にプログラミングを教えていたときに、この「2進数」「10進数」、あと「16進数」という言葉で意外な誤解を生んでいた経験があります。
よく、こんな質問がありました。
「int型って10進数なんですか?」
「いや、intは整数型で、その値は整数値だよ」
「だから10進数ですよね?」
「いやいや、整数は整数であって、10進であるとか16進であるとか、そういうこととは無関係。強いて言えば2進数かな」
「でも、printf使うと10進数で表示されますけど?」
「それはね、“printf("%d\n", n)”って感じでd変換の書式を使っているからだよ。d変換をするとint型の値が10進数で表示される。ここでたとえばx変換をすれば16進数でも表示される」
なんて話になるわけです。
K&Rにこんな演習問題があります(B.W.カーニハン/D.M.リッチー著 石田晴久訳 「プログラミング言語C 第2版」 共立出版、57ページより引用)。

演習 2-3 16進数の文字列(0xあるいは0Xが付いているものも含めて)をそれと同値な整数値へ変換する関数htoi(s)を書け。許される文字は0から9とaからfおよびAからFである。

この問題を読んだ新入社員たちは悩むわけです。「16進数の文字列」とはいったい何のこっちゃ?
問題文自体が不親切、というのも確かにそうですが、それより訳も疑ってみる必要がありそうだな、というわけで、原著(Brian W. Kernighan / Dennis M. Ritchie 「The C Programming Language Second Edition」 Prentice Hall)を当たってみました(46ページより引用)。

Exercise 2-3. Write the function htoi(s), which converts a string of hexadecimal digits (including an optional 0x or 0X) into its equivalent integer value. The allowable digits are 0 through 9, a through f, and A through F.

「16進数の文字列」が原著では“a string of hexadecimal digits”となっています。“hexadecimal digit”は日本語で言えば「16進法で使われる数字」でしょうか。“a string of hexadecimal digits”は「16進法で使われる数字から成る文字列」? ううむ、わかりづらいですね。何かうまい訳は無いものでしょうか。K&Rの訳者は、たぶん面倒だからこれを「16進数の文字列」と訳してしまったのでしょう。
いずれにしても、“converts a string of hexadecimal digits into its equivalent integer value”で何をすべきなのか理解するのは、「int型って10進数なんですか?」という質問が出てくるような段階ではつらいかも知れません。でも日本語訳ではより誤解を招く、わかりづらい表現になっているかなあ、という気もします。

というわけで、私も「2進数」「10進数」「16進数」などという表現を安易に使わないように気をつけよう、などと思ったりもしているところなのですが……まてよ、このあいだ書いた本で、そんな表現をしていたいような……(『「ネットワーク技術」勉強会』 34ページより)。

「人間が使う10進数」と「コンピュータが使う2進数」との間の変換は面倒です。たとえば10進数で「123」という数値があったとしたら、
(中略)
という感じで2進数の「1111011」に変換できます。

ダメじゃん。

[前へ] [次へ]

[Home] [戻る]


mailto:lepton@amy.hi-ho.ne.jp