我宣布了兩個工會
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
,第二個半字節是0xb
。然而,它僅在unionB
中是0xb
。它是0xc
中的unionA
。
我正在Windows 11上運行Visual Studio 2019。
我的理解是,無論比特字段的數據類型如何,行為都必須相同。造成這種差異的原因是什么?
C++中的聯合與C中的聯合不同。在C++中,任何時候只有一個成員處于活動狀態,從非活動成員讀取數據是未定義的行為。來自cpppreference:
自從引入
std::variant
(c++17)以來,我不知道在c++中使用聯合。聯合的目的是節省內存,而不是執行類型雙關。