C++中關(guān)于union的使用方法說明
1 概述
1.1 定義
union即為聯(lián)合,它是一種特殊的類。通過關(guān)鍵字union進(jìn)行定義,一個(gè)union可以有多個(gè)數(shù)據(jù)成員。
例如:
union Token{ char cval; int ival; double dval; };
以上代碼定義了一個(gè)名為Token的聯(lián)合,該聯(lián)合中包含了3個(gè)數(shù)據(jù)成員。
1.2 互斥賦值
在任意時(shí)刻,聯(lián)合中只能有一個(gè)數(shù)據(jù)成員可以有值。
當(dāng)給聯(lián)合中某個(gè)成員賦值之后,該聯(lián)合中的其它成員就變成未定義狀態(tài)了。
Token token; token.cval = 'a'; token.ival = 1; token.dval = 2.5;
以上代碼定義了聯(lián)合Token的一個(gè)變量token,此時(shí)token所占內(nèi)存的數(shù)據(jù)如圖1所示。
圖1 token所占內(nèi)存數(shù)據(jù)
紅色方框內(nèi)的數(shù)據(jù)即為token所占內(nèi)存數(shù)據(jù)。因?yàn)閠oken中長(zhǎng)度最大的變量是double類型,所以token的長(zhǎng)度是8個(gè)字節(jié)。
之后首先為token的變量cval賦值,此時(shí)token所占內(nèi)存的數(shù)據(jù)如圖2所示。
圖2 token所占內(nèi)存數(shù)據(jù)
此時(shí),token所占內(nèi)存的第一個(gè)字節(jié)的值變?yōu)?x61,即字符’a’。
接下來為token的變量ival賦值,此時(shí)token所占內(nèi)存的數(shù)據(jù)如圖3所示。
圖3 token所占內(nèi)存數(shù)據(jù)
此時(shí),token所占內(nèi)存的前四個(gè)字節(jié)變?yōu)?x00000001,即為數(shù)字1。在對(duì)token的ival賦值之后,cval的值就變?yōu)榱?x01,實(shí)際上就沒有意義了。
最后,為token的變量dval賦值,此時(shí)token所占內(nèi)存的數(shù)據(jù)如圖4所示。
圖4 token所占內(nèi)存數(shù)據(jù)
此時(shí),token所占內(nèi)存的八個(gè)字節(jié)都有了相應(yīng)的值。在對(duì)token的dval賦值之后,cval的值變?yōu)榱?x00,而ivale的值變?yōu)榱?x00000000,都沒有了實(shí)際意義,也就是之前提到的未定義狀態(tài)。
1.3 訪問權(quán)限
聯(lián)合可以為其成員指定public、protected和private等訪問權(quán)限,默認(rèn)情況下,其成員的訪問權(quán)限為public。在“1.1 定義”中定義的聯(lián)合Token,其三個(gè)成員的訪問權(quán)限均為public。
2 為成員指定長(zhǎng)度
在“1.2 互斥賦值”中提到,聯(lián)合的存儲(chǔ)空間至少能夠容納其最大的數(shù)據(jù)成員。
也可以為聯(lián)合的成員指定長(zhǎng)度。
通過冒號(hào)操作符來實(shí)現(xiàn)成員長(zhǎng)度的指定。
union U { unsigned short int aa; struct { unsigned int bb : 7;//(bit 0-6) unsigned int cc : 6;//(bit 7-12) unsigned int dd : 3;//(bit 13-15) }; } u;
以上代碼定義了一個(gè)名為U的聯(lián)合,并且定義了U的變量u。
聯(lián)合U包含兩個(gè)成員,一個(gè)是unsigned short int類型的變量,其大小為2個(gè)字節(jié);另一個(gè)是一個(gè)自定義結(jié)構(gòu),該自定義結(jié)構(gòu)中包含了3個(gè)unsigned int類型的變量。
需要注意的是,每個(gè)unsigned int類型的變量的大小并不是默認(rèn)的4個(gè)字節(jié),而是通過冒號(hào)操作符指定了其大小,該大小的單位是比特。所以,聯(lián)合u的大小是2個(gè)字節(jié)。
之后,對(duì)聯(lián)合u中的aa進(jìn)行賦值
u.aa = 0xE07F;
此時(shí),聯(lián)合u所占的內(nèi)存數(shù)據(jù)如圖5所示。
圖5 聯(lián)合u所占內(nèi)存數(shù)據(jù)
此時(shí),u.bb所處的位置是0-6比特;u.cc所處的位置是7-12比特;u.dd所處的位置是13-15比特,如圖6所示。
圖6 聯(lián)合u的結(jié)構(gòu)
所以,此時(shí)u.bb的值是127;u.cc的值是0;u.dd的值是7。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++?高精度乘法運(yùn)算的實(shí)現(xiàn)
本文主要介紹了C++?高精度乘法運(yùn)算的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01基于Qt實(shí)現(xiàn)自定義時(shí)間選擇控件
這篇文章主要為大家詳細(xì)介紹了如何基于Qt實(shí)現(xiàn)自定義時(shí)間選擇控件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12C++與C#互調(diào)dll的實(shí)現(xiàn)步驟
這篇文章主要介紹了C++與C#互調(diào)dll的實(shí)現(xiàn)步驟,dll動(dòng)態(tài)鏈接庫(kù)的共享在一些大型項(xiàng)目中有一定的應(yīng)用價(jià)值,需要的朋友可以參考下2014-08-08C語(yǔ)言入門篇--sizeof與strlen基礎(chǔ)理論
本篇文章是c語(yǔ)言基礎(chǔ)篇,主要為大家介紹了C語(yǔ)言的sizeof與strlen的基本理論知識(shí),希望可以幫助大家快速入門c語(yǔ)言的世界,更好的理解c語(yǔ)言2021-08-08數(shù)據(jù)結(jié)構(gòu)之矩陣行列和相等的實(shí)例
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之矩陣行列和相等的實(shí)例的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10C++ 中dynamic_cast<>的使用方法小結(jié)
將一個(gè)基類對(duì)象指針(或引用)cast到繼承類指針,dynamic_cast會(huì)根據(jù)基類指針是否真正指向繼承類指針來做相應(yīng)處理2013-03-03遞歸法求最大公約數(shù)和最小公倍數(shù)的實(shí)現(xiàn)代碼
今天整理了一下用遞歸法求最大公約數(shù)(gcd)和最小公倍數(shù)(lcm)。主要的工作是求最大公約數(shù)。數(shù)學(xué)上可以用輾轉(zhuǎn)法求最大公約數(shù)2013-05-05