利用大小端·模式資料存放的順序不同以及聯合體的特殊記憶體配置設定來實作。判斷函數如下:
void JudgeEndianness(void)
{
union
{
int x;
char x0;
}u={.x=}; //初始化聯合體中的成員整形資料x
if(u.x0 == ) printf("小端模式");//低位址存放低位元組
if(u.x0 == ) printf("大端模式");//低位址存放高位元組
}
大端模式:記憶體的低位址存放資料的高位元組
小端模式:記憶體的低位址存放資料的低位元組
以上面的函數為例:
x = 0x11223344;
1)假設x的首位址是0xFFFF FFF1,也就是存放x的記憶體的起始位址;那麼存放四個資料,位址由低到高分别為:
0xFFFF FFF1、 0xFFFF FFF2、 0xFFFF FFF3、 0xFFFF FFF4;
第一個就是最低的記憶體位址了:0xFFFF FFF1;
3)假設在大端模式下:低位址存放高位元組
最低記憶體位址:0xFFFF FFF1
最高資料位元組:0x11
具體存儲如下:
0xFFFF FFF1:0x11
0xFFFF FFF2:0x22
0xFFFF FFF3:0x33
0xFFFF FFF4:0x44
4)假設在小端模式下:低位址存放低位元組
最低記憶體位址:0xFFFF FFF1
最低資料位元組:0x44
具體存儲如下:
0xFFFF FFF1:0x44
0xFFFF FFF2:0x33
0xFFFF FFF3:0x22
0xFFFF FFF4:0x11
5)再根據聯合體資料類型的特點:聯合體裡的成員記憶體是共享的或者說是覆寫的,并且資料記憶體存儲的長度就是存儲最長的内部成員的長度。以上函數中的u.x0是char類型的,隻占一個位元組,并且u.x0的内容是聯合體u的最低記憶體位址的裡的内容。根據大小端模式的不同而不同,進而可以判斷大小端模式。
P.S:一般X86的是小端模式
2015.4.2 00:23
pillarpeng