endian指的是當物理上的最小單元比邏輯上的最小單元小時,邏輯單元對映到物理單元的排布關係。
實際的例子
如果你在文件上看到一個雙字組的data,Ex: long MyData=0x12345678,要寫到從0x0000開始的記憶體位址時。
如果你在文件上看到一個雙字組的data,Ex: long MyData=0x12345678,要寫到從0x0000開始的記憶體位址時。
- 如果是Big Endian的系統,
存到記憶體會變成 0x12 0x34 0x56 0x78,最高位元組在位址最低位元,最低位元組在位址最高位元,依次排列。 - 如果是Little Endian的系統,
存到記憶體會變成 0x78 0x56 0x34 0x12,最低位元組在最低位元,最高位元組在最高位元,反序排列。
比較的結果就是這樣:
big-endian | little-endian | |
0x0000 | 0x12 | 0x78 |
0x0001 | 0x34 | 0x56 |
0x0002 | 0x56 | 0x34 |
0x0003 | 0x78 | 0x12 |
這有什麼差別呢?
以目前常見的CPU為例:
以目前常見的CPU為例:
- INTEL X86、DEC VAX 使用 LITTLE-ENDIAN 設計;
- HP、IBM、MOTOROLA 68K 系列使用 BIG-ENDIAN 設計;
- POWERPC 同時支援兩種格式,稱為 BI-ENDIAN。
另外,以我目前在SID測試的程式testendian.c為例,我必須在以下的三個地方都必須指定Endian,否則即使Build時可以通過,但在計算時就可能會出現問題,因為放入記憶體內的資料可能是反過來的。
- 在Compile時
就必須先指定是要採用那種Endian,如果不指定,會使用內定值 - 在ToolChain內
也必須指定是要採用那種Endian,如果不指定,也會使用內定值 - 在SID內
也是由設定來決定Endian,所以在模擬CPU的Configuration內也必須指定是要採用那種Endian
testendian.c
#include
typedef union { long l; unsigned char c[4]; } EndianTest;
int main(int argc, char* argv[]) {
EndianTest a;
a.l=0x12345678;
int i=0;
if(a.c[0]==0x78 && a.c[1]==0x56 && a.c[2]==0x34 && a.c[3]==0x12) {
printf("This system is 'Little Endian'.\n"); }
else if(a.c[0]==0x12 && a.c[1]==0x34 && a.c[2]==0x56 && a.c[3]==0x78) {
printf("This system is 'Big Endian'.\n"); }
else {printf("This system is 'Unknown Endian'.\n"); }
printf("for a long variable value is 0x%lX\n",a.l);
printf("and its storage order in memory :\n");
for(i=0;i<4 0x="0x" :=":" a.c="a.c" amp="amp" br="br" i="i" n="n" p="p" printf="printf">// getchar(); // wait for a key ..。
return 0;
}4>
typedef union { long l; unsigned char c[4]; } EndianTest;
int main(int argc, char* argv[]) {
EndianTest a;
a.l=0x12345678;
int i=0;
if(a.c[0]==0x78 && a.c[1]==0x56 && a.c[2]==0x34 && a.c[3]==0x12) {
printf("This system is 'Little Endian'.\n"); }
else if(a.c[0]==0x12 && a.c[1]==0x34 && a.c[2]==0x56 && a.c[3]==0x78) {
printf("This system is 'Big Endian'.\n"); }
else {printf("This system is 'Unknown Endian'.\n"); }
printf("for a long variable value is 0x%lX\n",a.l);
printf("and its storage order in memory :\n");
for(i=0;i<4 0x="0x" :=":" a.c="a.c" amp="amp" br="br" i="i" n="n" p="p" printf="printf">// getchar(); // wait for a key ..。
return 0;
}4>
沒有留言:
張貼留言