我宣布了两个工会
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。
我的理解是,无论位域的数据类型如何,行为都必须相同。是什么导致了这种差异?
1条答案
按热度按时间ttp71kqs1#
C中的联合与C中的联合不同。在C中,任何时候都只有一个成员 active,从非active成员阅读是 undefined behavior。从cppreference:
联合体至少要足够大,以容纳其最大的数据成员,但通常不会更大。其他数据成员将分配在与该最大成员相同的字节中。该分配的详细信息由实现定义。但是所有非静态数据成员将具有相同的地址(C14起).从非最近写入的联合体成员中读取是未定义的行为。
自从
std::variant
(c17)被引入以来,我不知道在C++中有任何联合的使用。联合的目的是保存内存,而不是执行类型双关。