C++中union的使用方法
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。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构