今天做到一道關於存儲的題,順便回顧一下大小端:
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