结构中的位是否得到保证

2024-03-25

我有一个与结构位字段相关的问题,请参阅下文,因为我对应该使用哪些关键字来最好地描述我的问题有点无能为力:

背景:我正在为 MIPS R3000A 汇编指令编写一个反汇编程序,该指令在 2000 年初用于 Playstation 程序。

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

struct Instruction {
    u32 other:26;
    u32 op:6;
};

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

是否保证所有使用小字节序的编译器将始终使用 op:6 位字段来存储前 6 个 MSB ? (这是一个直观的位计数器,您会假设最后 6 位存储在操作位字段中)

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

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);

在我这边工作得很好,使用结构方法似乎稍微快一点,更不用说它更直观和清晰,但我担心不能保证前 6 位存储在第二位中 -结构体的“op”字段。


C 标准不保证位字段的排列方式。它确实需要每个实现来定义它,因此它应该位于编译器的文档中。根据 C 2018 6.7.2.1 11:

实现可以分配任何足够大以容纳位字段的可寻址存储单元。如果剩余足够的空间,则结构中紧跟在另一个位字段之后的位字段应被打包到同一单元的相邻位中。如果剩余空间不足,则不适合的位字段是否放入下一个单元或与相邻单元重叠是实现定义的。单元内位字段的分配顺序(高位到低位或低位到高位)是由实现定义的。可寻址存储单元的对齐方式未指定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结构中的位是否得到保证 的相关文章

随机推荐