FineView Software Labs




ビッグエンディアンとリトルエンディアン (Big Endian, Little Endian)
x86アーキテクチャのCPUとモトローラ系のCPUでは、16bit型、32bit型の数値を メモリへ格納する際、ストアする順番が異なります。
このメモリ上へのストア順の違いが、ビッグエンディアン、リトルエンディアンと いった言葉で表現されています。

x86系(・・・要はインテルマシン。)は、リトルエンディアン形式を採用しています。
リトルエンディアンでは、下位バイトからメモリにストアされます。 逆にビッグエンディアンでは、上位バイトからメモリにストアされます。

32bit型でのエンディアンによる違い
ここで、10という値を例にとります。 10という値を32bit型の16進数で表すと、00 00 00 0A となります。最下位バイトは0Aとなります。 なので、リトルエンディアンでは、下位バイトからメモリにストアされるので 0A 00 00 00となります。
逆にビッグエンディアンでは、上位バイトから順にメモリにストアされるので、 00 00 00 0Aとなります。

16bit型でのエンディアンによる違い
X, Yにそれぞれ640, 480という値が入っているとします。 16進数で表わすとそれぞれ 02 80, 01 E0となります。この値を16bit型でメモリにストアすると リトルエンディアンでは、下位バイトからメモリにストアされるので 80 02 E0 01となります。
ビッグエンディアンでは、上位バイトからメモリにストアされるので、 02 80 01 E0となります。

エンディアンの違いに気を配るのはどういったとき?
ウィンドウズマシンのCPUはインテル、あるいは互換アーキテクチャのAMDなどのCPUです。 これらのCPUは、リトルエンディアンでデータを扱います。 Macintoshや、アミガ、SGIなどモトローラ系CPUは、ビッグエンディアンでデータを扱うので、 インテルのマシンでこれらエンディアンの異なるマシンのデータを触ろうとすると 32bit型、16bit型のデータが、バイト順逆さまの状態で取得されてしまいます。
バイト順が逆さまなので、データを参照する前にはスワップ処理と呼ばれる バイト順の入れ替え処理が必要になります。

ロングスワップとショートスワップ

static unsigned long LongSWAP(unsigned char *b)
{
  return (unsigned long) b[3] +  (((unsigned long) b[2]) <<  8) +
    (((unsigned long) b[1]) << 16) + (((unsigned long) b[0]) << 24) ;
}

static unsigned short ShortSWAP(unsigned char *b)
{
  return (unsigned shrot)b[1] + (((unsigned short) b[0]) << 8);
}

ビッグエンディアンな画像形式
アミガのIFF形式や、シリコングラフィクス社のSGI形式、MachintoshのPSD形式など。


参考ページ
SPARCとx86アーキテクチャの相違