聯合體(union)的使用和分析
1、聯合體
聯合體(union)與結構體(struct)有一些相似之處。但兩者有本質上的不同。在結構體中,各成員有各自的內存空間, 一個結構變量的總長度是各成員長度之和。而在聯合體中,各成員共享一段內存空間, 一個聯合變量的長度等于各成員中最長的長度。應該說明的是, 這里所謂的共享不是指把多個成員同時裝入一個聯合變量內, 而是指該聯合變量可被賦予任一成員值,但每次只能賦一種值, 賦入新值則沖去舊值。
2、聲明共用體類型
一個聯合體類型必須經過定義之后, 才能使用它,才能把一個變量聲明定義為該聯合體類型。
聯合變量的聲明和結構變量的聲明方式相同, 也有三種形式。
一般形式具體如下:
union共用體名 { //成員列表 數據類型成員名; 數據類型成員名; .... }
示例:
union_MQ { chardata8[4]; intdata32; };
3、定義共用體變量
一般形式具體如下:
union_MQ { chardata8[4]; intdata32; }; //定義共用體變量 union_MQmq;
合并簡化形式具體如下:
union_MQ { chardata8[4]; intdata32; }mq;
匿名結構體形式具體如下:
union { chardata8[4]; intdata32; }mq;
使用 typedef 聲明共用體類型,再定義共用體變量:
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; }
結果:
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
結果分析:
1、聯合體的大小為最大成員的大小,在聯合體union Test中unsigned int是最大的占4個字節。
2、聯合體共用一塊內存,其內存大小為最大成員的內存大小,所以所以成員的地址都一樣,&test = &test.a = &test.b = &test.c。
3、給聯合體某個成員賦值時會影響到另外一個成員的數值,如下圖:
如果是小端模式:
變量高位是放高地址、變量低位是放低地址。這里test.c=0x11223344指11為高位、44為低位。
棧區遵循“先進后出、后進先出”的規則,即打印的時候從高地址到地址依次打印,所以test.c打印值為11223344。
從上圖可以看出,test.a、test.b和test.c的起使地址都是44對應的地址,所以他們的地址都是一樣的。
如果test.a = 0x88,那么test.a、test.b和test.c本來的值都會發生改變,即test.a = 88,test.b = 3388,test.c = 11223388。
利用聯合體處理浮點型數據
經過上面對聯合體的簡單介紹,想必不少同學已經知道小飛哥接下來要說什么了吧
直接上測試代碼:
測試結果是什么呢?
輸入的浮點數是6.91,我們可以看到uint8_data也有了4個值,從聯合體的定義來看,這兩個值應該是一樣的,我們來驗證下是不是如此:
浮點轉16進制還是挺麻煩的,有精力的同學可以自己算算,沒精力的同學可以使用這個鏈接的在線轉換工具
http://xnkiot.com/#/floating
轉換之后的結果跟我們上面代碼運行的結果是一致的
那這個轉換有什么意義呢?我們經常通訊串數過程中,比如串口傳輸的事單字節數據,對于float類型的數據就不能直接傳輸了,需要進行轉化,使用聯合體就可以很方便的進行“自動轉換”了
審核編輯:湯梓紅
-
數據
+關注
關注
8文章
6891瀏覽量
88827 -
內存
+關注
關注
8文章
2999瀏覽量
73883 -
變量
+關注
關注
0文章
613瀏覽量
28329 -
結構體
+關注
關注
1文章
129瀏覽量
10833 -
union
+關注
關注
0文章
10瀏覽量
4253
原文標題:如何使用union處理浮點數據?
文章出處:【微信號:小飛哥玩嵌入式,微信公眾號:小飛哥玩嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論