聯(lián)合體(union)的使用和分析
1、聯(lián)合體
聯(lián)合體(union)與結(jié)構(gòu)體(struct)有一些相似之處。但兩者有本質(zhì)上的不同。在結(jié)構(gòu)體中,各成員有各自的內(nèi)存空間, 一個(gè)結(jié)構(gòu)變量的總長(zhǎng)度是各成員長(zhǎng)度之和。而在聯(lián)合體中,各成員共享一段內(nèi)存空間, 一個(gè)聯(lián)合變量的長(zhǎng)度等于各成員中最長(zhǎng)的長(zhǎng)度。應(yīng)該說(shuō)明的是, 這里所謂的共享不是指把多個(gè)成員同時(shí)裝入一個(gè)聯(lián)合變量?jī)?nèi), 而是指該聯(lián)合變量可被賦予任一成員值,但每次只能賦一種值, 賦入新值則沖去舊值。
2、聲明共用體類(lèi)型
一個(gè)聯(lián)合體類(lèi)型必須經(jīng)過(guò)定義之后, 才能使用它,才能把一個(gè)變量聲明定義為該聯(lián)合體類(lèi)型。
聯(lián)合變量的聲明和結(jié)構(gòu)變量的聲明方式相同, 也有三種形式。
一般形式具體如下:
union共用體名 { //成員列表 數(shù)據(jù)類(lèi)型成員名; 數(shù)據(jù)類(lèi)型成員名; .... }
示例:
union_MQ { chardata8[4]; intdata32; };
3、定義共用體變量
一般形式具體如下:
union_MQ { chardata8[4]; intdata32; }; //定義共用體變量 union_MQmq;
合并簡(jiǎn)化形式具體如下:
union_MQ { chardata8[4]; intdata32; }mq;
匿名結(jié)構(gòu)體形式具體如下:
union { chardata8[4]; intdata32; }mq;
使用 typedef 聲明共用體類(lèi)型,再定義共用體變量:
typedefunionMQ { chardata8[4]; intdata32; }_MQ; //定義共用體變量,以下兩種效果一樣 unionMQmq; _MQmq;
4、上代碼:
#includeunionTest{ unsignedchara; unsignedshortb; unsignedintc; }; intmain(void) { unionTesttest; printf("%lu ",sizeof(unionTest)); printf("%lu ",sizeof(test)); printf("&test=%p,&test.a=%p,&test.b=%p,&test.c=%p ",&test,&test.a,&test.b,&test.c); test.c=0x11223344; printf("test.c=%x ",test.c); printf("test.a=%x ",test.a); printf("test.b=%x ",test.b); test.a=0x88; printf("test.c=%x ",test.c); printf("test.a=%x ",test.a); printf("test.b=%x ",test.b); return0; }
結(jié)果:
4 4 &test=0x7fff4a0708c4,&test.a=0x7fff4a0708c4,&test.b=0x7fff4a0708c4,&test.c=0x7fff4a0708c4 test.c=11223344 test.a=44 test.b=3344 test.c=11223388 test.a=88 test.b=3388
結(jié)果分析:
1、聯(lián)合體的大小為最大成員的大小,在聯(lián)合體union Test中unsigned int是最大的占4個(gè)字節(jié)。
2、聯(lián)合體共用一塊內(nèi)存,其內(nèi)存大小為最大成員的內(nèi)存大小,所以所以成員的地址都一樣,&test = &test.a = &test.b = &test.c。
3、給聯(lián)合體某個(gè)成員賦值時(shí)會(huì)影響到另外一個(gè)成員的數(shù)值,如下圖:
如果是小端模式:
變量高位是放高地址、變量低位是放低地址。這里test.c=0x11223344指11為高位、44為低位。
棧區(qū)遵循“先進(jìn)后出、后進(jìn)先出”的規(guī)則,即打印的時(shí)候從高地址到地址依次打印,所以test.c打印值為11223344。
從上圖可以看出,test.a、test.b和test.c的起使地址都是44對(duì)應(yīng)的地址,所以他們的地址都是一樣的。
如果test.a = 0x88,那么test.a、test.b和test.c本來(lái)的值都會(huì)發(fā)生改變,即test.a = 88,test.b = 3388,test.c = 11223388。
利用聯(lián)合體處理浮點(diǎn)型數(shù)據(jù)
經(jīng)過(guò)上面對(duì)聯(lián)合體的簡(jiǎn)單介紹,想必不少同學(xué)已經(jīng)知道小飛哥接下來(lái)要說(shuō)什么了吧
直接上測(cè)試代碼:
測(cè)試結(jié)果是什么呢?
輸入的浮點(diǎn)數(shù)是6.91,我們可以看到uint8_data也有了4個(gè)值,從聯(lián)合體的定義來(lái)看,這兩個(gè)值應(yīng)該是一樣的,我們來(lái)驗(yàn)證下是不是如此:
浮點(diǎn)轉(zhuǎn)16進(jìn)制還是挺麻煩的,有精力的同學(xué)可以自己算算,沒(méi)精力的同學(xué)可以使用這個(gè)鏈接的在線轉(zhuǎn)換工具
http://xnkiot.com/#/floating
轉(zhuǎn)換之后的結(jié)果跟我們上面代碼運(yùn)行的結(jié)果是一致的
那這個(gè)轉(zhuǎn)換有什么意義呢?我們經(jīng)常通訊串?dāng)?shù)過(guò)程中,比如串口傳輸?shù)氖聠巫止?jié)數(shù)據(jù),對(duì)于float類(lèi)型的數(shù)據(jù)就不能直接傳輸了,需要進(jìn)行轉(zhuǎn)化,使用聯(lián)合體就可以很方便的進(jìn)行“自動(dòng)轉(zhuǎn)換”了
審核編輯:湯梓紅
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7238瀏覽量
90956 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3107瀏覽量
74970 -
變量
+關(guān)注
關(guān)注
0文章
614瀏覽量
28810 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
130瀏覽量
11025 -
union
+關(guān)注
關(guān)注
0文章
10瀏覽量
4398
原文標(biāo)題:如何使用union處理浮點(diǎn)數(shù)據(jù)?
文章出處:【微信號(hào):小飛哥玩嵌入式,微信公眾號(hào):小飛哥玩嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
labview和單片機(jī)通訊浮點(diǎn)數(shù)如何處理?
單片機(jī)浮點(diǎn)數(shù)轉(zhuǎn)十六進(jìn)制,串口接收浮點(diǎn)數(shù)處理
數(shù)據(jù)轉(zhuǎn)換:十六進(jìn)制與浮點(diǎn)數(shù)的互相轉(zhuǎn)換
定點(diǎn)數(shù)和浮點(diǎn)數(shù)的區(qū)別是什么
浮點(diǎn)數(shù)在單片機(jī)數(shù)據(jù)采集監(jiān)控系統(tǒng)中的應(yīng)用
浮點(diǎn)數(shù)的表示方法

浮點(diǎn)數(shù)常用的編碼方法

32位浮點(diǎn)數(shù)字信號(hào)處理器SHARC產(chǎn)品組合(ADI)
modbus 如何讀取浮點(diǎn)數(shù)
FLASH存儲(chǔ)浮點(diǎn)數(shù)據(jù)的解決辦法

如何在FPGA中正確處理浮點(diǎn)數(shù)運(yùn)算
談一談浮點(diǎn)數(shù)的精度問(wèn)題

什么是浮點(diǎn)數(shù)?浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)

評(píng)論