转载:https://blog.csdn.net/hou09tian/article/details/80816445

1 概述

1.1 定义

union即为联合,它是一种特殊的类。通过关键字union进行定义,一个union可以有多个数据成员。例如

  1.  
    union Token{
  2.  
    char cval;
  3.  
    int ival;
  4.  
    double dval;
  5.  
    };

以上代码定义了一个名为Token的联合,该联合中包含了3个数据成员。

1.2 互斥赋值

在任意时刻,联合中只能有一个数据成员可以有值。当给联合中某个成员赋值之后,该联合中的其它成员就变成未定义状态了。

  1.  
    Token token;
  2.  
     
  3.  
    token.cval = 'a';
  4.  
     
  5.  
    token.ival = 1;
  6.  
     
  7.  
    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 互斥赋值”中提到,联合的存储空间至少能够容纳其最大的数据成员。也可以为联合的成员指定长度。通过冒号操作符来实现成员长度的指定。

  1.  
    union U {
  2.  
     
  3.  
    unsigned short int aa;
  4.  
     
  5.  
    struct {
  6.  
     
  7.  
    unsigned int bb : 7;//(bit 0-6)
  8.  
     
  9.  
    unsigned int cc : 6;//(bit 7-12)
  10.  
     
  11.  
    unsigned int dd : 3;//(bit 13-15)
  12.  
     
  13.  
    };
  14.  
     
  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的使用方法的更多相关文章

  1. Linq中Union与Contact方法用法对比

    文章一开始,我们来看看下面这个简单的实例. 代码片段1: int[] ints1 = { 2, 4, 9, 3, 0, 5, 1, 7 }; int[] ints2 = { 1, 3, 6, 4, 4 ...

  2. Python杂谈: 集合中union和update的区别(Python3.x)

    集合中union和update方法都是将多个可迭代的对象合并,但是返回的结果和对初始对象的影响却不一样 # union() 方法 - a.union(b) 将集合a和集合b取并集,并将并集作为一个新的 ...

  3. MySQL中union和order by一起使用的方法

    MySQL中union和order by是可以一起使用的,但是在使用中需要注意一些小问题,下面通过例子来说明.首先看下面的t1表. 1.如果直接用如下sql语句是会报错:Incorrect usage ...

  4. 讲解Canvas中的一些重要方法

    Canvas所提供的各种方法根据功能来看大致可以分为几类: 第一是以drawXXX为主的绘制方法: 第二是以clipXXX为主的裁剪方法: 第三是以scale.skew.translate和rotat ...

  5. Altium中Logo的导入方法及大小调整

    Altium中Logo的导入方法及大小调整   LOGO识别性是企业标志的重要功能之一,特点鲜明.容易辨认,很多客户需要在PCB设计阶段导入LOGO标示归属特性.如果LOGO是CAD图纸,可以直接按照 ...

  6. [转]VB.net中 excel 的range方法

    本文转自:https://blog.csdn.net/bigheadsheep/article/details/7711235 第五章 Range对象基本操作应用示例(1)Range对象可能是VBA代 ...

  7. JavaScript中Math对象的方法介绍

    1.比较最值方法 比较最值有两种方法,max() 和 min() 方法. 1.1 max() 方法,比较一组数值中的最大值,返回最大值. var maxnum = Math.max(12,6,43,5 ...

  8. Android中锁定文件的方法

    androidSDK中并没有锁定文件相关的api. 但是android是基于linux操作系统的,linux比较底层,灵活性也更大,为了实现锁定文件的效果,大概有以下几种办法: 用chmod命令修改文 ...

  9. jQuery中的事件绑定方法

    在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...

随机推荐

  1. 使用intellij IDEA远程连接服务器部署项目

    由于不想每次打开上传的文件软件,故研究使用intellij IDEA集成 ,下面是我使用的过程的一些记录. 使用intellij 远程连接服务器连接Linux服务器部署项目,方便我们开发测试. 本人使 ...

  2. [ASP.NET Core开发实战]基础篇04 主机

    主机定义 主机是封闭应用资源的对象. 设置主机 主机通常由 Program 类中的代码配置.生成和运行. HTTP项目(ASP.NET Core项目)创建泛型主机: public class Prog ...

  3. sublime Text 3安装 Sublime Package Control(这个可以用于安装各种插件)时显示默认安装的c盘内存不够的解决方案

    首先先关闭st3 之后在安装的路径下创建Data文件夹,然后打开st3(sublime Text 3简写)CTRL+`打开命令行输入以下内容,直接回车,等待下载完成就可以了import urllib. ...

  4. 程序员你的maven多模块项目如何对外输出为一个构件?

    上图为常见的台式机,程序员,你看了有啥启发? 台式机生产线 我的maven代码工程 xxx 显示器 xxx-web 主机 xxx-app 键盘 xxx-domian 鼠标 xxx-infrastrat ...

  5. VMware安装Centos7 -九五小庞

    VMware安装Centos7超详细过程(图文) https://blog.csdn.net/babyxue/article/details/80970526 安装centos7的时候 启动会提示Pl ...

  6. 用Python实现十大经典排序算法-插入、选择、快速、冒泡、归并等

    本文来用图文的方式详细讲解了Python十大经典排序算法 —— 插入排序.选择排序.快速排序.冒泡排序.归并排序.希尔排序.插入排序.桶排序.基数排序.计数排序算法,想要学习的你们,继续阅读下去吧,如 ...

  7. Centos7安装后进不去,死活就要填licence,该怎么办?

    遇到这个问题不要麻爪,跟着我做: 1 回车 2 回车 c 回车 c 回车 然后就进入系统了. 要使它联网,点右上角的开关按钮,将PCI Ethernet选择为connect状态. 我的centos7是 ...

  8. Tomcat cluster方案共享session配置成功,yeah....

    后继版本:https://www.cnblogs.com/xiandedanteng/p/12143112.html 参考网文: 1.Tomcat官方文档 2.https://blog.51cto.c ...

  9. 《Linux 操作系统》Linux的常用命令操作大全

    前言 在学习命令之前先学习我们该如何去学习linux 命令. 几乎每一个命令都有参数,每个参数的含义是什么,我们一般也不是全部都能记住,所以我们必须有一个可以知道每一个命令下各个参数的含义的方法. 命 ...

  10. docker导出导入镜像docker save和docker load的用法

    1.百度搜的第一步是先将容器提交为镜像,然后用你提交的镜像去做上面的备份操作,提交为镜像后会新增一个镜像,但是感觉没有必要,直接做上面的save操作也是可以用的 百度的:docker commit 容 ...