首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >结构中的位是否得到保证?

结构中的位是否得到保证?
EN

Stack Overflow用户
提问于 2019-08-01 11:02:11
回答 1查看 119关注 0票数 3

我有一个关于结构位字段的问题,请看下面,因为我有点不知道应该使用哪些关键字来最好地描述我的问题:

上下文:我正在为MIPS R3000A汇编指令编写反汇编程序,该程序在2000年初用于Playstation程序。

问题:我想知道在这段代码中:

代码语言:javascript
代码运行次数:0
运行
复制
struct Instruction {
    u32 other:26;
    u32 op:6;
};

//main:
Instruction instruction = *(Instruction*)(data + pc);
printf("%02x\n", instruction.op);

它保证所有的编译器,使用小的endianness,将始终使用op:6位字段来存储前6个MSB?(这有点违背直觉,您可以假设最后6位存储在op位字段中)

它是以下代码的替代方案:

代码语言:javascript
代码运行次数:0
运行
复制
static uint32_t get_op_code(uint32_t data) {
    uint16_t mask = (1 << 6) - 1;
    return (data >> 26) & mask;
}

//main:
uint32_t instruction = *(uint32_t*)(data + pc);
uint32_t op = get_op_code(instruction);
printf("%02x\n", op);

它在我这边工作得很好,使用结构方法似乎要快一些,更不用说更直观和清晰了,但是我恐怕不能保证第一个比特存储在结构的第二个位字段"op“中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-01 11:07:27

C标准并不保证比特字段的排列方式。它确实需要每个实现来定义它,所以它应该在编译器的文档中。2018年6.7.2.1 11

实现可以分配任何足以容纳位字段的可寻址存储单元。如果有足够的空间,在结构中立即跟随另一个位场的位场应被包装成同一单元的相邻位元。如果空间不足,是否将不适合的位字段放入下一个单元或重叠相邻单元是实现定义的。在一个单元内分配位字段的顺序(高阶到低阶或低阶到高阶)是实现定义的。可寻址存储单元的对齐未指定。

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

https://stackoverflow.com/questions/57307550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档