現在のコンピュータ*1は、8bit=1byte
のデータを処理の基本単位としている。つまり、CPUの内部のデータ処理や、メモリーにデータを記憶したり周辺装置とデータの入出力を行なうなどで1byteが最小単位*2になっている。
当然ながら、コンピュータで処理するデータの単位はバイトだけではない。というより、最近のCPUのほとんどは32bit(4byte)単位*3で処理を行なうのが普通で、8bit(1byte)や16bit(2byte)単位での処理はその中の一部だ。
そして2byte以上の幅を持つデータをメモリに格納するときや転送するときなど、バイト単位で処理する場合にどの位置のデータから処理するかを「バイトオーダー」と呼ぶ。
このバイトオーダーには、データの上位から処理するか、下位から格納するかの二種類があり、これをそれぞれ「ビッグエンディアン」と「リトルエンディアン」と呼ぶ。
アドレス 00 01 02 03 little -> 78 56 34 12 big -> 12 34 56 78
例えば、4byte幅のデータ「0x12345678」を、メモリーに格納するとき、0x78 0x56 0x34 0x12 と並ぶのがリトルエンディアン、逆に
0x12 0x34 0x56 0x78 と並ぶのがビッグエンディアンである。
理論的には、データの並びがどちらでもない(例えば0x34 0x12 0x56 0x78
のような)方法を考えることも可能だが、実際に見たことはない。こんな直感的でない方式を採用することに意味がないような気がする。
データの順番を見ているとリトルエンディアンも直感的な方法から外れているように思える。
ただ、
00 12 01 34 02 56 03 78
0003 12 0002 34 0001 56 0000 78
のように書けば、アドレスが下から上に伸びることさえ許容できばそれほど外れていないのかも。
で、いろいろ調べてもはっきりとはわからないのだが、大型計算機やミニコンはビッグエンディアンだったらしい。
そして、マイクロプロセッサではIntel はリトルエンディアンを Motrola はビッグエンディアンを採用して…、いたんだけど、現在では Intel (と
AMD)以外のほとんどの CPU はビッグエンディアンとリトルエンディアンを選択できるようになっているようだ。
少なくとも ARM、MIPS、SH3、SH4*4は起動時にエンディアンの選択ができたし、PowerPC では動作中に切り換えることができるらしい。
とはいえ、これはリトルエンディアンの方が勝れていたというわけではなく、もっとも身近なPCの世界で Intel の CPU が勝利を収めたせいだろう。
実のところ、プログラムを作る際にどちらの方式であってもさほど不便を感じることはない。
もっともリトルエンディアンは8bitから16、32、64bitと桁が増えてもデータの最下位がそろっているため、例えば
unsigned long ulx = 0x1234;
unsigned short *p;
p = &ulx;
のような、いい加減なプログラムがあっても ulx に16bit以上の数値を入れない限り問題なく動作するというメリット*5がある。
またPCの世界ではほとんど Intel の CPU が使用されていることもあって、あまりよくメンテナンスされていない Linux
のドライバなどなどではリトルエンディアンでないと動かないなんてことも珍しくない。
もちろんこれらはビッグエンディアンの問題ではなくて、できの悪いプログラムとプログラマーの問題に過ぎないのだが。
それと外部デバイスが16、32bitとなった場合にリトルエンディアンの場合はそのまま上位のデータバスを接続すれば良いけど、ビッグエンディアンは8bitずつ上位下位を入れ替えないといかん……、うん、ビットオーダーも入れ替えると上下逆につなぐだけで良いのかな…。
CPU内部だけでなく、その他でもエンディアンの問題は付いてまわる。
PCI BUS は Intel が規格を策定したのでリトルエンディアンだし、通信の世界は TCP/IP
はビッグエンディアンだが他の規格ではまた違う。UNICODE は両方あるので、データにエンディアンの識別子が付いている。
ATA-IF はIBM-PCが起源だからと思いきや、数値と文字列(型番やとシリアル番号)などは逆順になっているという、なんとも素敵な実装だ。
最後に、バイトオーダーのことをエンディアンとも呼ぶのは、『ガリバー旅行記』の「小人国」で卵を大きい方(丸い方)から割る人々と、小さい方(とがった方)割る人々の対立が描かれているのに由来する、という話しは何度も聞いたことがあった。けど確認したことはなかったので、調べてみたら、
It is allowed on all hands, that the primitive way of breaking eggs, before we eat them, was upon the larger end; but his present majesty's grandfather, while he was a boy, going to eat an egg, andbreaking it according to the ancient practice, happened to cut one of his fingers. Whereupon the emperor his father published an edict, commanding all his subjects, upon great penalties, to break the smaller end of their eggs.
とあって、
Many hundred large volumes have been published upon this controversy: but the books of the Big-endians have been long forbidden, and the whole party rendered incapable by law of holding employments.
この論争に関して何百巻もの大冊が出版されているが、大端宗派のものはもう長い間発禁となっており、同派の連中は法律によって全員公職から閉め出されている。
と出てくる。
このENDIAN という単語は(おそらく)辞書に載っていない。
これ以外の場面では使うことはないんだろうか。
某社(アメリカの会社だ)のマニュアルを読んでいると、
typedef struct {
BYTE m_byMode;
BYTE m_bStructSize[3]; // This structure size. BIG INDIAN
BYTE m_bWidth[2]; // Bitmap width. BIG INDIAN
BYTE m_bHeight[2]; // Bitmap height. BIG INDIAN
unsigned char raw[];
} RMABITMAP, *PRMABITMAP;
BIG INDIAN indicates that the first BYTE in the array is the most significant BYTE.
なんて記述があった。10人のLittle INDIAN は有名だけど「BIG INDIAN」っていったいなんなんだ。
*1 メインフレームと呼ばれる機械は使ったことがないしミニコンピュータもよく知らない。この文章で言うコンピュータはマイクロプロセッサを使用したもので、さらにマイナーな機種は除く。
*2 もちろん bit単位の処理も可能である。
*3 64bit CPU もあるし、16bit や8bit CPU も少ないわけではない。
*4 alphaはよく知らないし、ビッグッグエンディアン専用のCPUもある。
*5 ビッグエンディアンならこんなプログラムが動かないので世に出ないメリットがある。