C++中union的使用方法

C++中union的使用方法1 概述 1 1 定义 union 即为联合 它是一种特殊的类 通过关键字 union 进行定义 一个 union 可以有多个数据成员 例如 unionToken charcval intival doubledval 以上代码定义了一个名为 Token 的联合 该联合中包含了 3 个数据成员 1 2 互斥赋值在任意时刻 联合中只能有一个数据成员可以有值 当给联合中某个成员赋值之后

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所示。

C++中union的使用方法 

1 token所占内存数据

红色方框内的数据即为token所占内存数据。因为token中长度最大的变量是double类型,所以token的长度是8个字节。

之后首先为token的变量cval赋值,此时token所占内存的数据如图2所示。

 C++中union的使用方法

2 token所占内存数据

此时,token所占内存的第一个字节的值变为0x61,即字符’a’。

接下来为token的变量ival赋值,此时token所占内存的数据如图3所示。

 C++中union的使用方法

3 token所占内存数据

此时,token所占内存的前四个字节变为0x00000001,即为数字1。在对tokenival赋值之后,cval的值就变为了0x01,实际上就没有意义了。

最后,为token的变量dval赋值,此时token所占内存的数据如图4所示。

C++中union的使用方法 

4 token所占内存数据

此时,token所占内存的八个字节都有了相应的值。在对tokendval赋值之后,cval的值变为了0x00,而ivale的值变为了0x00000000,都没有了实际意义,也就是之前提到的未定义状态。

1.3 访问权限

联合可以为其成员指定publicprotectedprivate等访问权限,默认情况下,其成员的访问权限为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个字节;另一个是一个自定义结构,该自定义结构中包含了3unsigned int类型的变量。需要注意的是,每个unsigned int类型的变量的大小并不是默认的4个字节,而是通过冒号操作符指定了其大小,该大小的单位是比特。所以,联合u的大小是2个字节。

之后,对联合u中的aa进行赋值

u.aa = 0xE07F;

此时,联合u所占的内存数据如图5所示。

C++中union的使用方法

5 联合u所占内存数据

此时,u.bb所处的位置是0-6比特;u.cc所处的位置是7-12比特;u.dd所处的位置是13-15比特,如图6所示。

C++中union的使用方法 

6 联合u的结构

所以,此时u.bb的值是127u.cc的值是0u.dd的值是7








版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222052.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午4:40
下一篇 2026年3月17日 下午4:40


相关推荐

  • OpenProcessToken令牌函数使用方法

    OpenProcessToken令牌函数使用方法转载自:https://www.cnblogs.com/mengfanrong/p/5185850.html GetCurrentProcessID得到当前进程的IDOpenProcessToken得到进程的令牌句柄LookupPrivilegeValue查询进程的权限AdjustTokenPrivileges调整令牌权限要对一个随意进程(包括系统安全进程和服务进程)进行指定…

    2022年6月25日
    24
  • 《自然语言处理实战入门》 第三章 :中文分词原理及相关组件简介 —- 语言学与分词技术简介[通俗易懂]

    汉语,即汉族的语言,是中国通用语言,国际通用语言之一,属汉藏语系,汉语历史悠久,使用人数最多,世界上使用汉语的人数至少15亿,超过世界总人口的20%汉字最早起源于商朝的甲骨文,距今已经有3000-4000年的历史了。文字的目的是为了记录,古汉语以独字为核心,即使隋唐以后汉语书面语逐渐向口语化发展。

    2022年4月17日
    36
  • 土地利用转移矩阵怎么做_土地利用转移矩阵年份怎么看

    土地利用转移矩阵怎么做_土地利用转移矩阵年份怎么看一、2000年-2005年土地利用转移矩阵1、转换工具-由栅格转出-栅格转面:grid转shp2、合并之后,属性表添加字段:类型和面积(一定要带年份,方便后续处理)3、DataManagementTools→Generalization→Dissolve数据管理工具-制图综合-融合(选择年份+类型名称、面积)4、AnalysisTools→Overlay→Intersect分析工具-叠加分析-相交5、生成结果之后打开属性表,添加字段为newarea,计算几何,然后导出结

    2025年5月28日
    8
  • nod32 update and id

    nod32 update and idnod32update:http://u1.nod32cn.comnod32id:www.for-ever.cn/nod32转载于:https://www.cnblogs.com/stoneresearch/archive/2008/08/27/4336645.html

    2022年6月29日
    31
  • leetcode270. 最接近的二叉搜索树值

    leetcode270. 最接近的二叉搜索树值给定一个不为空的二叉搜索树和一个目标值 target 请在该二叉搜索树中找到最接近目标值 target 的数值 注意 给定的目标值 target 是一个浮点数题目保证在该二叉搜索树中只会存在一个最接近目标值的数示例 输入 root 4 2 5 1 3 目标值 target 3 25 13 输出 4

    2026年3月16日
    2
  • php的opendir,phpopendir函数与opendir语法

    php的opendir,phpopendir函数与opendir语法opendir 语法 opendir path context 目录 功能说明 打开目录句柄 opendir 函数打开一个目录句柄 则该函数返回一个目录流 否则返回 false 来看个 opendir 列出目录下所有文件实例 代码如下 dirs 指定当前上当 if is dir dirs hanld opendir dirs while file re

    2026年3月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号