C++中关于union的使用方法说明

 更新时间:2022年11月24日 10:45:41   作者:棉猴  
这篇文章主要介绍了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。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 老生常谈C++ explicit关键字

    老生常谈C++ explicit关键字

    这篇文章主要介绍了C++ explicit关键字,explicit关键字只需用于类内的单参数构造函数前面,由于无参数的构造函数和多参数的构造函数总是显式调用,这种情况在构造函数前加explicit无意义,需要的朋友可以参考下
    2023-03-03
  • C++ 高精度乘法运算的实现

    C++ 高精度乘法运算的实现

    本文主要介绍了C++ 高精度乘法运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • 基于Qt实现自定义时间选择控件

    基于Qt实现自定义时间选择控件

    这篇文章主要为大家详细介绍了如何基于Qt实现自定义时间选择控件,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • 详解C++虚函数的工作原理

    详解C++虚函数的工作原理

    这篇文章主要介绍了C++虚函数的工作原理的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • C语言实现图片放大缩小

    C语言实现图片放大缩小

    这篇文章主要为大家详细介绍了C语言实现图片放大缩小,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C++与C#互调dll的实现步骤

    C++与C#互调dll的实现步骤

    这篇文章主要介绍了C++与C#互调dll的实现步骤,dll动态链接库的共享在一些大型项目中有一定的应用价值,需要的朋友可以参考下
    2014-08-08
  • C语言入门篇--sizeof与strlen基础理论

    C语言入门篇--sizeof与strlen基础理论

    本篇文章是c语言基础篇,主要为大家介绍了C语言的sizeof与strlen的基本理论知识,希望可以帮助大家快速入门c语言的世界,更好的理解c语言
    2021-08-08
  • 数据结构之矩阵行列和相等的实例

    数据结构之矩阵行列和相等的实例

    这篇文章主要介绍了数据结构之矩阵行列和相等的实例的相关资料,希望通过本文能帮助到大家,让大家掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • C++ 中dynamic_cast<>的使用方法小结

    C++ 中dynamic_cast<>的使用方法小结

    将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理
    2013-03-03
  • 递归法求最大公约数和最小公倍数的实现代码

    递归法求最大公约数和最小公倍数的实现代码

    今天整理了一下用递归法求最大公约数(gcd)和最小公倍数(lcm)。主要的工作是求最大公约数。数学上可以用辗转法求最大公约数
    2013-05-05

最新评论