代码之家  ›  专栏  ›  技术社区  ›  Andreas Brinck

提取数据的联合

c++
  •  4
  • Andreas Brinck  · 技术社区  · 14 年前

    工会不进来吗 this 问题原因UB当用作此项时:

    union Data
    {
        unsigned int intValue;
        unsigned char argbBytes[4];
    };
    Data data;
    data.intValue = 1235347;
    unsigned char alpha = data.argbBytes[0]; //UB?
    

    在联合体中,最多一个数据 也就是说,最多有一个 数据成员可以存储在 任何时候都可以。

    3 回复  |  直到 7 年前
        1
  •  3
  •   jk.    14 年前

    一般来说,您是对的,将一种类型的值写入联合,然后将其作为另一种类型读取是未定义的行为。另一方面,iirc标准明确地允许将任何内容转换为char数组。我从来没有百分之百地清楚哪个优先,但我使用过的所有实现都允许联合铸造做你想做的事情。

        2
  •  3
  •   Scott Langham    14 年前

    我想这是未定义的,因为您所做的是特定于平台的。alpha最终将成为一个不同的值,这取决于您的平台是big-endian还是little-endian。

    发明union的真正原因是允许人们在较小的内存中容纳更多的数据。传统上,与联合一起,您需要在联合外部保存一些标记(可能是位掩码中存储的一个或两个位),以记住联合的哪个成员是活动的。使用这个标记,您可以仔细地编写对联合的访问代码,以便只读取活动成员。

        3
  •  0
  •   Chubsdad    14 年前

    也不清楚机器的末端是什么。让我们假设小端点。

    在这种情况下,0x12D993(十进制1235347)将存储为

    0x93 0xd9 0x12 0x00(递增地址)