C/C++中union关键字总结

文章主要对union关键字进行了简单总结
  1. union的涵义
    (1) union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置 空间,在 union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所 有的数据成员具有相同的起始地址。
    (2) 一个 union 只配置一个足够大的空间以来容纳最大长度的数据成员
    (3) 在 C++里,union 的成员默认属性页为 public。union 主要用来压缩空间。如果一些数据不可能在同一时间同时被用到,则可以使用 union。

  2. 与union关联的一个非常重要的概念:大/小端
    (1) 大端模式:高字节在低地址位,低字节在高地址位;
    (2) 小端模式:高字节在高地址位,低字节在低地址位;
    (3) union 型数据所占的空间等于其最大的成员所占的空间。对 union 型的成员的存取都是相对于该联合体基地址的偏移量为 0 处开始,也就是联合体的访问不论对哪个变量的存取都 是从 union 的首地址位置开始。

  3. 如何判断自己的操作系统是大端还是小端存储模式?
    举例如下:
    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 = 153092353

  4. union的作用是什么?
    (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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值