ミドルエンディアン (PDPエンディアン,NUXI問題)
エンディアンというと,ほとんどの場合ビッグエンディアンとリトルエンディアンのどちらかだが,これら以外のエンディアンも存在する.(していた,というべきか?)
バイト列 0x01,0x02,0x03,0x04 を4バイト整数として解釈する時に, 0x01020304 となるのがビッグエンディアン, 0x04030201 となるのがリトルエンディアンだが,これら以外に 0x03040102 や 0x02010403 となるものも存在する.以前から,これらを何エンディアンと呼ぶのか疑問に思っていた.
Wikipedia の「エンディアン」の項目 によると,このようなエンディアンは DEC の PDP-11 や VAX シリーズで使われていたことから「PDP エンディアン」というらしい.エンディアンの異なるマシン間でバイナリデータを交換すると, "UNIX" という文字列が "NUXI" に化けたという故事にちなんで, "NUXI 問題 " という言葉も知られている.
「ミドルエンディアン 」という言い方も見つけた.なおこのページでは,日付の表記法もエンディアンで分類している.
- yy/mm/dd:ビッグエンディアン (日本式)
- dd/mm/yy:リトルエンディアン (ヨーロッパ式)
- mm/dd/yy:ミドルエンディアン (米国式)
私は外国式で日付を書くときに,よく dd/mm/yy か mm/dd/yy か迷うが,「米国はミドル,ヨーロッパはリトル」と覚えときゃいいんだ!
でもそれで米国の日付を yy/dd/mm などど書いちゃったらどうしよう.(^^;)
それに「ミドル」と「リトル」って発音似てるからまた間違いそうだし….
韻も踏んぢゃってるし….
私は最初,「ビッグエンディアン」と「リトルエンディアン」を逆に解釈していた.(^^;)
「ビッグエンディアン」は「大きい (big) 方で終わる (end)」という意味だと思ったからだ. (あなたもそうじゃありませんか?)
しかしこれらの言葉は,卵を丸い (大きい) 方の端 (end) から割るか,尖った (小さい) 方の端から割るかということに由来する (上記の Wikipedia「エンディアン」の項目の「語源
」を参照).
ところで同じミドルエンディアンといっても, 0x02010403 型と 0x03040102 型を区別する言葉はないんだろうか?
「NUXI エンディアン」とか「IXUN エンディアン」はどうだろう?
64ビット CPU が普及して8バイト整数がよく使われるようになると,もっと色々なミドルエンディアンが出て … こないだろうな.(笑)
ホームページに,実行時にエンディアンを判定する関数 (C言語) を掲載しました.