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都是小端字节序,小端字节序又被称为主机字节序。大端称为网络字节序

上一篇:python 类型提示


下一篇:Mysql 获取前30天日期