事情發生在不同的processor對於 byte order會有相反的狀況,因此有了所謂的Big-endian和Little-endian。
對一個32-bit 整數0x12345678來說
1. Little-endian如intel的processor,在記憶體的順序為
address value
0x00000001 0x78
0x00000002 0x56
0x00000003 0x34
0x00000004 0x12
2. Big-endian如powerpc的processor,在記憶體的順序為
address value
0x00000001 0x12
0x00000002 0x34
0x00000003 0x56
0x00000004 0x78
是相反的結果。如何判定是Big-endian還是Little-endian呢? 使用union。union的特性是共享記憶體,且以成員中佔最大記憶體為其size (struct是累加加上boundary alignment)。
所以可以像這樣
union
{
int a;
char b;
}EndianTest;
EndianTest.a = 1 /* 0x00000001 */;
if( EndianTest.b == 0x01 )
/* Little-endian */
else
/* Big-endian */
kernel裡的方式比厲害
static union
{
char c[4];
unsigned long l;
}endian_test = { { 'l','?','?','b' } };
#define ENDIANNESS ((char)endian_test.l)
char c = ENDIANNESS;
if (c == l) /* Little-endian */
if (c == b) /* Big-endian */