c++ 具有不同数据类型的并集的行为

64jmpszr  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(130)

我宣布了两个工会

typedef union
{
    struct
    {
        unsigned short n1 : 4;
        unsigned int n2 : 4;
    } s;
    unsigned int val;

} unionA;

typedef union
{
    struct
    {
        unsigned int n1 : 4;
        unsigned int n2 : 4;
    } s;
    unsigned int val;

} unionB;

我给val赋值为

unionA uA;
    unionB uB;
    uA.val = 0xba;
    uB.val = 0xba;

我期望在两种情况下,第一个半字节(用n1表示)都是0xa,第二个半字节(用n2表示)都是0xb,但是,只有在unionB中才是0xb,在unionA中才是0xc

我正在Windows 11上运行Visual Studio 2019。
我的理解是,无论位域的数据类型如何,行为都必须相同。是什么导致了这种差异?

ttp71kqs

ttp71kqs1#

C中的联合与C中的联合不同。在C中,任何时候都只有一个成员 active,从非active成员阅读是 undefined behavior。从cppreference
联合体至少要足够大,以容纳其最大的数据成员,但通常不会更大。其他数据成员将分配在与该最大成员相同的字节中。该分配的详细信息由实现定义。但是所有非静态数据成员将具有相同的地址(C14起).从非最近写入的联合体成员中读取是未定义的行为。
自从std::variant(c
17)被引入以来,我不知道在C++中有任何联合的使用。联合的目的是保存内存,而不是执行类型双关。

相关问题