歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 小議大小端模式對C語言的共用體結構的影響

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

日期:2017/3/1 10:33:21   编辑:Linux編程

小議大小端模式對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