ビッグエンディアンとリトルエンディアン

12bitの数値 1010 1101 0010 を考える。(十進数にすると2770(二千七百七十))
1つのアドレスに4bit格納できるものとすると、ビッグエンディアンとリトルエンディアンのアドレスとbitの関係は以下のようになる。

address 1 2 3
data 1010 1101 0010
address 1 2 3
data 0010 1101 1010

ちなみにリトルエンディアンの各データの左右を入れ替えると、、、
0100 1011 0101
となる。これは元の数値データの左右を入れ替えた形と同じになる。


インテル系のcpuを使用し、C言語コンパイル実行すると、double型はリトルエンディアンになっていることがわかっった。

  • ソース
#include<stdio.h>
main(){
  double a;
  unsigned char* p;
  a=7.5;
  
  p=(unsigned char*)&a; 
  int i,j;
  for(i=0;i<8;i++)for(j=0;j<8;j++)printf("%d",(((unsigned  char)*(p+i))>>j)&(unsigned char)1);
  puts("");
}
  • 実行結果
0000000000000000000000000000000000000000000000000111100000000010

補足:データの頭から尻尾にかけて、1バイトづつ下位bitから8bit読み込んで書き込んでいる。結果的に1バイトを左右反転させている。double型のデータはリトルエンディアンなので、実行結果は元のdouble型の数値データの左右を反転させた形になっている。(double型のデータは上位ビットが指数部(整数情報)、下位ビットが仮数部(少数情報)で少々複雑に構成されている。)