联合体union和大小端(big-endian、little-endian)
1.聯(lián)合體union的基本特性——和struct的同與不同
union,中文名“聯(lián)合體、共用體”,在某種程度上類似結(jié)構(gòu)體struct的一種數(shù)據(jù)結(jié)構(gòu),共用體(union)和結(jié)構(gòu)體(struct)同樣可以包含很多種數(shù)據(jù)類型和變量。
在成員完全相同的情況下,struct比union占用的內(nèi)存要多一些。
原因是C中struct和union的內(nèi)存分配機(jī)制不同:
在struct中,所有的成員都有自己的存儲(chǔ)空間,而且為了便于尋址和管理,所有的數(shù)據(jù)成員都要遵循內(nèi)存對(duì)齊的規(guī)則;
在union中,所有的成員共用一塊存儲(chǔ)空間,在操作不同的成員時(shí),編譯器依據(jù)不同的成員類型,按照不同的方式取值。
2.聯(lián)合體union所占內(nèi)存空間大小:
#include<stdio.h> union unionTest{int a;double b; } main(){union unionTest test;printf("The sizeof of test is %d\n",sizeof(test)); }
結(jié)果:
The?sizeof?of?test?is?8
說明:聯(lián)合體所分配內(nèi)存空間的大小為聯(lián)合體中所占字節(jié)最大成員的大小。
3.聯(lián)合體union和大小端(big-endian、little-endian):?
#include<stdio.h> union var{char c[4];int i; };
int main(){union var data;data.c[0] = 0x04;//因?yàn)槭莄har類型,數(shù)字不要太大,算算ascii的范圍~data.c[1] = 0x03;//寫成16進(jìn)制為了方便直接打印內(nèi)存中的值對(duì)比data.c[2] = 0x02;data.c[3] = 0x11;//數(shù)組中下標(biāo)低的,地址也低,按地址從低到高,內(nèi)存內(nèi)容依次為:04,03,02,11。總共四字節(jié)!
//而把四個(gè)字節(jié)作為一個(gè)整體(不分類型,直接打印十六進(jìn)制),應(yīng)該從內(nèi)存高地址到低地址看,0x11020304,低位04放在低地址上。printf("%x\n",data.i); }
結(jié)果:
11020304
說明我的32位win7系統(tǒng)為小端方式。
?
轉(zhuǎn)載于:https://www.cnblogs.com/muhuacat/p/8268974.html
總結(jié)
以上是生活随笔為你收集整理的联合体union和大小端(big-endian、little-endian)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电动车电机多少钱啊?
- 下一篇: $(shell expr $(MAKE_