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