开发者

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

开发者 https://www.devze.com 2022-12-03 12:03 出处:网络 作者: 棉猴
目录1 概述1.1 定义1.2 互斥赋值1.3 访问权限2 为成员指定长度1 概述 1.1 定义 union即为联合,它是一种特殊的类。通过关键字union进行定义,一个union可以有多个数据成员。
目录
  • 1 概述
    • 1.1 定义
    • 1.2 互斥赋值
    • 1.3 访问权限
  • 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所占www.devze.com内存数据。因为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。在对token的ival赋值之后,cval的值就变为了0x01,实际上就没有意义了。

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

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

    图4 token所占内存数据

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

    1.3 访问权限

    联合可以为其成员指定public、pjavas开发者_JS开发criptrotected和private等访问权限,默认情况下,其成员的访问权限为public。在“1.1 定义”中定义的联合Token,其三个成员的访问权限均为public。

    2 为成员指定长度

    在“1.2 互斥赋值”中提到,联合的存储空间至少能够容纳其最大的数据成员。

    也可以为联合的成员指定长度。

    通过冒号操作符来实现成员长度的指定。

    union U {
     
    unsignedhttp://www.devze.com short int aa;
     
    struct {
     
    unsigned int bb : 7;//(bit 0-6)
     
    unsigned pythonint cc : 6;//(bit 7-12)
     
    unsigned int dd : 3;//(bit 13-15)
     
    };
     
    } u;

    以上代码定义了一个名为U的联合rwQAbz,并且定义了U的变量u。

    联合U包含两个成员,一个是unsigned short int类型的变量,其大小为2个字节;另一个是一个自定义结构,该自定义结构中包含了3个unsigned 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的值是127;u.cc的值是0;u.dd的值是7。

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

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号