小議大小端模式對C語言的共用體結構的影響
1、一些問題
問題1
[plain]
- #include "stdio.h"
- union
- {
- int i;
- char ch[2];
- }key;
- main()
- {
- key.i=65*256+66;
- printf("%c\t%c\n",key.ch[0],key.ch[1]);
- }
答案是B A;為什麼不是A B呢?
在前面的文章中我們已經測試過(相關閱讀:http://www.linuxidc.com/Linux/2012-02/53889.htm 與 http://www.linuxidc.com/Linux/2012-02/53890.htm),X86體系結構的CPU是小端模式的。比如一個數0x1234,放在內存裡按照內存地址從低往高實際上是低地址字節裡放的是0x34,高字節裡放的是0x12。小端模式和我們平時感覺上的一致,把數位數越高的部分放在地址越高的部分。union類型是共享內存的,union中是按照從低到高放的,i=0x4142,也就是低地址中放的是42,高地址中放的是41,按照ch[0],ch[1]的順序輸出就是B A。如果是大端模式的話就是打印兩個空了,故不會出現A B的情況。
問題2
[plain]
- union myun
- {
- struct { int x; int y; int z; }u;
- int k;
- }a;
- int main()
- {
- a.u.x =4;
- a.u.y =5;
- a.u.z =6;
- a.k = 0;
- printf("%d %d %d\n",a.u.x,a.u.y,a.u.z);
- return 0;
- }
union類型是共享內存的,以size最大的結構作為自己的大小,這樣的話,myun這個結構就包含u這個結構體,而大小也等於u這個結構體的大小,在內存中的排列為聲明的順序x,y,z從低到高,然後賦值的時候,在內存中,就是x的位置放置4,y的位置放置5,z的位置放置6,現在對k賦值,對k的賦值因為是union,要共享內存,所以從union的首地址開始放置,首地址開始的位置其實是x的位置,這樣原來內存中x的位置就被k所賦的值代替了,就變為0了,這個時候要進行打印,就直接看內存裡就行了,x的位置也就是k的位置是0,而y,z的位置的值沒有改變,所以應該是0,5,6。