網站首頁 編程語言 正文
1 概述
1.1 定義
union即為聯合,它是一種特殊的類。通過關鍵字union進行定義,一個union可以有多個數據成員。
例如:
union Token{
char cval;
int ival;
double dval;
};
以上代碼定義了一個名為Token的聯合,該聯合中包含了3個數據成員。
1.2 互斥賦值
在任意時刻,聯合中只能有一個數據成員可以有值。
當給聯合中某個成員賦值之后,該聯合中的其它成員就變成未定義狀態了。
Token token;
token.cval = 'a';
token.ival = 1;
token.dval = 2.5;
以上代碼定義了聯合Token的一個變量token,此時token所占內存的數據如圖1所示。
圖1 token所占內存數據
紅色方框內的數據即為token所占內存數據。因為token中長度最大的變量是double類型,所以token的長度是8個字節。
之后首先為token的變量cval賦值,此時token所占內存的數據如圖2所示。
?
圖2 token所占內存數據
此時,token所占內存的第一個字節的值變為0x61,即字符’a’。
接下來為token的變量ival賦值,此時token所占內存的數據如圖3所示。
?
圖3 token所占內存數據
此時,token所占內存的前四個字節變為0x00000001,即為數字1。在對token的ival賦值之后,cval的值就變為了0x01,實際上就沒有意義了。
最后,為token的變量dval賦值,此時token所占內存的數據如圖4所示。
圖4 token所占內存數據
此時,token所占內存的八個字節都有了相應的值。在對token的dval賦值之后,cval的值變為了0x00,而ivale的值變為了0x00000000,都沒有了實際意義,也就是之前提到的未定義狀態。
1.3 訪問權限
聯合可以為其成員指定public、protected和private等訪問權限,默認情況下,其成員的訪問權限為public。在“1.1 定義”中定義的聯合Token,其三個成員的訪問權限均為public。
2 為成員指定長度
在“1.2 互斥賦值”中提到,聯合的存儲空間至少能夠容納其最大的數據成員。
也可以為聯合的成員指定長度。
通過冒號操作符來實現成員長度的指定。
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;
以上代碼定義了一個名為U的聯合,并且定義了U的變量u。
聯合U包含兩個成員,一個是unsigned short int類型的變量,其大小為2個字節;另一個是一個自定義結構,該自定義結構中包含了3個unsigned int類型的變量。
需要注意的是,每個unsigned int類型的變量的大小并不是默認的4個字節,而是通過冒號操作符指定了其大小,該大小的單位是比特。所以,聯合u的大小是2個字節。
之后,對聯合u中的aa進行賦值
u.aa = 0xE07F;
此時,聯合u所占的內存數據如圖5所示。
圖5 聯合u所占內存數據
此時,u.bb所處的位置是0-6比特;u.cc所處的位置是7-12比特;u.dd所處的位置是13-15比特,如圖6所示。
圖6 聯合u的結構
所以,此時u.bb的值是127;u.cc的值是0;u.dd的值是7。
原文鏈接:https://blog.csdn.net/hou09tian/article/details/80816445
相關推薦
- 2022-11-02 golang服務報錯:?write:?broken?pipe的解決方案_Golang
- 2022-06-11 FreeRTOS進階之系統延時完全解析_操作系統
- 2022-05-23 C#多線程之線程同步WaitHandle_C#教程
- 2022-07-17 一起詳細聊聊C#中的Visitor模式_C#教程
- 2023-04-03 Python調試神器之PySnooper的使用教程分享_python
- 2024-03-07 MyBatis多表映射
- 2022-09-30 Nginx使用ngx_http_upstream_module實現負載均衡功能示例_nginx
- 2022-10-19 Beego?AutoRouter工作原理解析_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支