程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 聯合體union和大小端(big-endian、little-endian),littleendian

聯合體union和大小端(big-endian、little-endian),littleendian

編輯:關於C語言

聯合體union和大小端(big-endian、little-endian),littleendian


1.聯合體union的基本特性——和struct的同與不同

union,中文名“聯合體、共用體”,在某種程度上類似結構體struct的一種數據結構,共用體(union)和結構體(struct)同樣可以包含很多種數據類型和變量。

在成員完全相同的情況下,struct比union占用的內存要多一些。

原因是C中struct和union的內存分配機制不同:

在struct中,所有的成員都有自己的存儲空間,而且為了便於尋址和管理,所有的數據成員都要遵循內存對齊的規則;

在union中,所有的成員共用一塊存儲空間,在操作不同的成員時,編譯器依據不同的成員類型,按照不同的方式取值。

2.聯合體union所占內存空間大小:

#include<stdio.h>
union unionTest{
        int a;
        double b;
}
main(){
        union unionTest test;
        printf("The sizeof of test is %d\n",sizeof(test));       
}

結果:

The sizeof of test is 8

說明:聯合體所分配內存空間的大小為聯合體中所占字節最大成員的大小。

3.聯合體union和大小端(big-endian、little-endian): 

#include<stdio.h>
union var{
        char c[4];
        int i;
};
int main(){ union var data; data.c[0] = 0x04;//因為是char類型,數字不要太大,算算ascii的范圍~ data.c[1] = 0x03;//寫成16進制為了方便直接打印內存中的值對比 data.c[2] = 0x02; data.c[3] = 0x11;//數組中下標低的,地址也低,按地址從低到高,內存內容依次為:04,03,02,11。總共四字節!
//而把四個字節作為一個整體(不分類型,直接打印十六進制),應該從內存高地址到低地址看,0x11020304,低位04放在低地址上。 printf("%x\n",data.i); }

結果:

11020304

說明我的32位win7系統為小端方式。

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved