天天看點

【C語言】[其他]:函數判斷大端模式還是小端模式

利用大小端·模式資料存放的順序不同以及聯合體的特殊記憶體配置設定來實作。判斷函數如下:

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

繼續閱讀