联合体是一个特殊的类,其关键词是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都是小端字节序,小端字节序又被称为主机字节序。大端称为网络字节序。