事情發生在不同的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 */

kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()