ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++之联合体

2021-12-24 15:59:11  阅读:144  来源: 互联网

标签:存储 cout union 联合体 C++ 内存 字节


一、联合体的定义

联合体是一个特殊的类,其关键词是union,联合体的数据任意时刻只有一个值是有状态的,当有新的数据赋值了,会将其他值覆盖掉。声明变量时,变量类型可以时public、private、protected,默认是public。

二、联合体的举例

union My_union
{
    int a;
    int b;
    double c;
}u;

三、联合体的特点

1、联合体申请的内存空间大小是联合体中占用内存最大的数据大小。例如上述的联合体,sizeof(My_union)的输出是 8,因为double在64为操作系统中是8字节的。
2、赋值顺序问题

//按照上面的共同体
int main()
{
    u.a =1;
    cout<<u.a<<endl;
    u.c = 2.0;
    cout<<u.a<<endl;
    cout<<u.b<<endl;
}

第一次输出u.a为1,但是第二次输出为0(0为初始值);u.b的输出也为0。看下面情况:

int main()
{
   u.c = 2.0;
   u.a =1;
   cout<<u.a<<endl;
   cout<<u.b<<endl;
   cout<<u.c<<endl;
}

此时u.a、u.b的输出为1,u.c的输出为2。此时a和b的值为2的原因是:a、b指向的覆盖了前4字节,而c还是2的原因是,2存储在了后四个字节,和a、b存储在了不同的四个字节中,所以c值还是2。但是c值足够大,用到了前4个字节,那么此时c的值肯定会变化。

总结:联合体的内存大小是定义时占用内存最大的数据类型大小。内存存储的数据是根据数据的赋值顺序来确定的,后赋值的数据会覆盖前面的赋值。

四、联合体的应用

1、判断电脑的字节序
字节序分为大端字节序小端字节序,大端字节序是指一个整数的位字节存储在了内存地址,低位字节存储在了内存高地址。小端字节序是整数的位字节存储在内存的地址,低位字节存储在内存低地址。

 33 void byteorder()
 34 {
 35     union{
 36         short value;
 37         char union_bytes[sizeof(short)];
 38     }test;
 39     test.value = 0x0102;
 40     if(test.union_bytes[0]==1 && test.union_bytes[1]==2)
 41     {
 42         cout<<"大端"<<endl;
 43     }
 44     else if(test.union_bytes[0]==2 && test.union_bytes[1]==1)
 45     {
 46         cout<<"小端"<<endl;
 47     }
 48     else{
 49         cout<<"error"<<endl;
 50     }
 51 }

现代大多数PC都是小端字节序,小端字节序又被称为主机字节序。大端称为网络字节序

标签:存储,cout,union,联合体,C++,内存,字节
来源: https://blog.csdn.net/qq_43363657/article/details/122127863

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有