歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

小議大小端模式對C語言的共用體結構的影響

小議大小端模式對C語言的共用體結構的影響

1、一些問題

問題1

[plain]
  1. #include "stdio.h"  
  2. union   
  3. {  
  4.     int i;  
  5.     char ch[2];  
  6. }key;  
  7. main()  
  8. {  
  9.     key.i=65*256+66;  
  10.     printf("%c\t%c\n",key.ch[0],key.ch[1]);  
  11. }  
答案是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]
  1. union myun   
  2. {  
  3.    struct { int x; int y; int z; }u;   
  4.    int k;   
  5. }a;   
  6. int main()   
  7. {   
  8.    a.u.x =4;  
  9.    a.u.y =5;   
  10.    a.u.z =6;   
  11.    a.k = 0;   
  12.    printf("%d %d %d\n",a.u.x,a.u.y,a.u.z);  
  13.    return 0;  
  14. }  
        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。
Copyright © Linux教程網 All Rights Reserved