C++中union的使用方法
转载:https://blog.csdn.net/hou09tian/article/details/80816445
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。
C++中union的使用方法的更多相关文章
- Linq中Union与Contact方法用法对比
文章一开始,我们来看看下面这个简单的实例. 代码片段1: int[] ints1 = { 2, 4, 9, 3, 0, 5, 1, 7 }; int[] ints2 = { 1, 3, 6, 4, 4 ...
- Python杂谈: 集合中union和update的区别(Python3.x)
集合中union和update方法都是将多个可迭代的对象合并,但是返回的结果和对初始对象的影响却不一样 # union() 方法 - a.union(b) 将集合a和集合b取并集,并将并集作为一个新的 ...
- MySQL中union和order by一起使用的方法
MySQL中union和order by是可以一起使用的,但是在使用中需要注意一些小问题,下面通过例子来说明.首先看下面的t1表. 1.如果直接用如下sql语句是会报错:Incorrect usage ...
- 讲解Canvas中的一些重要方法
Canvas所提供的各种方法根据功能来看大致可以分为几类: 第一是以drawXXX为主的绘制方法: 第二是以clipXXX为主的裁剪方法: 第三是以scale.skew.translate和rotat ...
- Altium中Logo的导入方法及大小调整
Altium中Logo的导入方法及大小调整 LOGO识别性是企业标志的重要功能之一,特点鲜明.容易辨认,很多客户需要在PCB设计阶段导入LOGO标示归属特性.如果LOGO是CAD图纸,可以直接按照 ...
- [转]VB.net中 excel 的range方法
本文转自:https://blog.csdn.net/bigheadsheep/article/details/7711235 第五章 Range对象基本操作应用示例(1)Range对象可能是VBA代 ...
- JavaScript中Math对象的方法介绍
1.比较最值方法 比较最值有两种方法,max() 和 min() 方法. 1.1 max() 方法,比较一组数值中的最大值,返回最大值. var maxnum = Math.max(12,6,43,5 ...
- Android中锁定文件的方法
androidSDK中并没有锁定文件相关的api. 但是android是基于linux操作系统的,linux比较底层,灵活性也更大,为了实现锁定文件的效果,大概有以下几种办法: 用chmod命令修改文 ...
- jQuery中的事件绑定方法
在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...
随机推荐
- 【Pod Terminating原因追踪系列之三】让docker事件处理罢工的cancel状态码
本篇为Pod Terminating原因追踪系列的第三篇,前两篇分别介绍了两种可能导致Pod Terminating的原因.在处理现网问题时,Pod Terminating属于比较常见的问题,而本系列 ...
- Babel知识点相关
本篇是根据最新babel 7版本写的,里面用到的一些babel相关包都是babel 7的 1,babel是如何工作的 babel是一个转译器,这里我严格区分了转译器和编译器,因为编译器最终生成 ...
- Oracle数据库的文件以及Oracle体系架构
第一部分.Oracle数据库的文件 1.参数文件:控制实例的行为的参数的集合 参数文件的作用 设定数据库的限制 设置用户或者进程的限制 设定数据库资源的限制 调整系统的性能 主要的参数文件 SGA_T ...
- 【Gin-API系列】部署和监控(九)
本文是[Gin-API系列]的最后一篇文章,简单介绍如何在生产环境的部署架构和监控手段. 生产部署 部署架构 使用Nginx加Keepalived的方式搭建,可以达到高可用的效果,并可以横向扩容 如何 ...
- shell知识点:${} 的神奇用法
为了完整起见,我这里再用一些例子加以说明 ${ } 的一些特异功能:假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt我们可以用 ${ } 分别替换获得不同的值 ...
- basicInterpreter1.02 增加对for循环的支持
源码下载:https://files.cnblogs.com/files/heyang78/basicInterpreter102-20200531-2.rar 输入: for x= to print ...
- 解决Maven下载速度缓慢问题
解决Maven下载速度缓慢问题 第一步:找到自己安装maven的路径,选择setting.xml D:\apache-maven-3.2.2\conf\settings.xml 第二步:打开setti ...
- Oracle Sqlplus 三项设置
显示sql执行时间:set timing on 显示sql execute plan:set autotrace trace exp 关闭 set autotrace off 设置行宽:set li ...
- web测试——弱网测试、暂停页面执行
1.弱网测试: 2.暂停页面执行 1.js代码:可以直接在页面上打断点 缺点:需要看懂前端的代码 2.点击暂停按钮,如下图,再次点击,可继续运行
- [程序员代码面试指南]数组和矩阵-数组的partition调整
题目 补充问题:数组只含0,1,2,对数组排序,要求时间复杂度O(n),额外空间复杂度O(1) 题解 维护三个变量,l,idx,r.左区间[0,l],中间区间[l+1,idx],右区间[idx+1,r ...