具有不同數據類型的聯合行為

我宣布了兩個工會

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:

聯盟至少與持有其最大數據成員所需的規模一樣大,但通常不會更大。其他數據成員將以與最大成員相同的字節分配。該分配的詳細信息是implementation-defined,但所有non-static數據成員將具有相同的地址(因為C++14)。這是一種未定義的行為,可以從工會成員那里讀取,而不是最近編寫的。

自從引入std::variant(c++17)以來,我不知道在c++中使用聯合。聯合的目的是節省內存,而不是執行類型雙關。

主站蜘蛛池模板: 色狠狠AV一区二区三区| 国产一区二区三区国产精品| 香蕉久久ac一区二区三区| 中文字幕一区二区三区视频在线| 亚洲精品伦理熟女国产一区二区| 成人精品视频一区二区三区| 国产一区二区三区在线| 亚洲欧洲日韩国产一区二区三区| 亚洲色无码一区二区三区| 国产AV国片精品一区二区| 在线|一区二区三区| 一区国产传媒国产精品| 久久精品亚洲一区二区三区浴池| 亚洲AⅤ视频一区二区三区| 黑人一区二区三区中文字幕| 国产SUV精品一区二区88| 自拍日韩亚洲一区在线| 99久久综合狠狠综合久久一区| 国产在线一区二区综合免费视频| 久久久国产一区二区三区| 国产一区二区在线观看视频| 日韩福利视频一区| 在线免费观看一区二区三区| 国产精品无码一区二区在线| 无码人妻精品一区二区蜜桃| 精品国产一区二区三区AV | 亚洲国产韩国一区二区| 久久免费区一区二区三波多野| 中文字幕一区二区人妻性色 | 99在线精品一区二区三区| 麻豆高清免费国产一区| 精品国产一区AV天美传媒| 亚洲一区二区三区在线网站| 亚洲色一区二区三区四区| 黑巨人与欧美精品一区| 国产一区二区三区电影| 中文字幕无线码一区| 一区二区在线观看视频| 99久久精品日本一区二区免费| 亚洲一区二区三区写真| 国产福利一区二区|