文章主要对union关键字进行了简单总结
union的涵义
(1) union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置 空间,在 union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所 有的数据成员具有相同的起始地址。
(2) 一个 union 只配置一个足够大的空间以来容纳最大长度的数据成员
(3) 在 C++里,union 的成员默认属性页为 public。union 主要用来压缩空间。如果一些数据不可能在同一时间同时被用到,则可以使用 union。与union关联的一个非常重要的概念:大/小端
(1) 大端模式:高字节在低地址位,低字节在高地址位;
(2) 小端模式:高字节在高地址位,低字节在低地址位;
(3) union 型数据所占的空间等于其最大的成员所占的空间。对 union 型的成员的存取都是相对于该联合体基地址的偏移量为 0 处开始,也就是联合体的访问不论对哪个变量的存取都 是从 union 的首地址位置开始。如何判断自己的操作系统是大端还是小端存储模式?
举例如下:
1 #include
2
3 using namespace std;
4 //测试系统的存储方式:大端/小端
5 void check_endian()
6 {
7 cout << “————————————————–” << endl;
8 cout << “测试大小端的问题:” << endl;
9 union
10 {
11 int a;
12 char b;
13 char c[2];
14 }*p, obj;
15
16 obj.b = 1;
17 //如果obj.a = 1,说明系统是小端模式,否则为大端模式
18 cout << “obj.a = ” << obj.a << endl;
19
20 if (obj.a == 1) {
21 cout << “系统存储方式是小端模式” << endl;
22 } else {
23 cout << “系统存储方式是大端模式” << endl;
24 }
25
26 obj.b = 0;
27 p = &obj;
28 p->c[0] = 0x01;
29 p->c[1] = 0x01;
30 cout << “p->a = ” << p->a << endl;
31 }
32
33 int main()
34 {
35 check_endian();
36
37 return 0;
38 }
测试大小端的问题:
obj.a = 153116673
系统存储方式是大端模式
p->a = 153092353union的作用是什么?
(1) 能够很容易地确定CPU的模式:大端/小端模式
(2) 能够很容易地进行类型转换,比如unisigned int转换成unsigned char;
举例说明:
//类型转换
33 void data_type_transfer()
34 {
35 union TestUnion
36 {
37 unsigned int a;
38 unsigned char b[4];
39 };
40
41 TestUnion test_union;
42 test_union.a = 0x11223344;
43 cout << “—————————————-” << endl;
44 printf(“%x, %x, %x, %x\n”,test_union.b[0],test_union.b[1],test_union.b[2],test_union.b[3]);
45 }
测试结果如下:
44, 33, 22, 11