ビッグエンディアンとリトルエンディアン
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型のデータは上位ビットが指数部(整数情報)、下位ビットが仮数部(少数情報)で少々複雑に構成されている。)