大小端存儲

今天做到一道關於存儲的題,順便回顧一下大小端:

union X
{
    int32_t a;
    struct 
    {
        int16_t b;
        int16_t c;
    };
};
int main(){
    X x;
    x.a=0x20150810;
    printf("%x,%x\n",x.b,x.c);
    return 0;
}

問輸出是什麼?
大家肯定都知道了這一道題要從大小端存儲出發考慮

首先具體介紹一下大小端的存儲模式
32bit寬的數0x12345678
在Little-endian模式CPU內存中的存放方式(假設從地址0x4000開始存放)爲:(低字節放地地址,高字節放高地址)
內存地址 0x4000 0x4001 0x4002 0x4003
存放內容 0x78 0x56 0x34 0x12
而在Big- endian模式CPU內存中的存放方式則爲:(低字節放高地址,高字節放低地址)
內存地址 0x4000 0x4001 0x4002 0x4003
存放內容 0x12 0x34 0x56 0x78

如果是小端存儲:0x20150810在內存中的存儲形式爲 10 08 15 20
所以輸出 printf(“%x,%x\n”,x.b,x.c)時爲08 10 20 15

如果是打斷存儲:0x20150810在內存中的存儲形式爲 20 15 08 10
所以輸出 printf(“%x,%x\n”,x.b,x.c)時爲20 15 08 10

發佈了49 篇原創文章 · 獲贊 11 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章