首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++结构包装顺序

C++结构包装顺序
EN

Stack Overflow用户
提问于 2020-11-16 18:19:14
回答 1查看 55关注 0票数 0

我有一个类似于以下内容的联盟:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef
union _thing
{
    struct thing_indiv {
        uint16_t one:5;
        uint16_t two:4;
        uint16_t three:5;
        uint16_t four:5;
        uint16_t five:6;
        uint16_t six:6;
        uint16_t seven:6;
        uint16_t eight:7;
        uint16_t nine:4;
        uint16_t ten:5;
        uint16_t eleven:6;
        uint16_t twelve:5;
        uint16_t thirteen:5;
        uint16_t fourteen:4;
        uint16_t fifteen:2;
        uint16_t unused:5;
    } __attribute__((packed)) thing_split;
    uint8_t thing_comb[10];
    
} thing;

但它的表现并不符合我的期望。我希望将字节分配给thing.thing_comb,并从thing.thing_split检索相关的项。

例如,如果我期望thing.thing_split.one包含0x1A ( 0xD6的5个最高有效位,但它没有,它包含0x16,5个最低有效位。我将每个字段声明为uint16_t,以防止gcc抱怨跨越字节边界(我在使用uint8_t时也经历了同样的行为)。

有没有一种方法来布局这个结构来获得这种行为?

EN

回答 1

Stack Overflow用户

发布于 2020-11-16 18:31:37

首先,在C++中使用联合的类型双关语是未定义的行为。其次,编译器可以自由地使用位域做任何它想做的事情。它不会像你想要的那样被强迫去布局。

你需要使用常规的位打包和位移位来获得你想要的行为。

不久前我遇到过一个类似的问题:How to use bitfields that make up a sorting key without falling into UB?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64863500

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文