我有一个关于结构位字段的问题,请看下面,因为我有点不知道应该使用哪些关键字来最好地描述我的问题:
上下文:我正在为MIPS R3000A汇编指令编写反汇编程序,该程序在2000年初用于Playstation程序。
问题:我想知道在这段代码中:
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位字段中)
它是以下代码的替代方案:
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“中。
发布于 2019-08-01 11:07:27
C标准并不保证比特字段的排列方式。它确实需要每个实现来定义它,所以它应该在编译器的文档中。2018年6.7.2.1 11
实现可以分配任何足以容纳位字段的可寻址存储单元。如果有足够的空间,在结构中立即跟随另一个位场的位场应被包装成同一单元的相邻位元。如果空间不足,是否将不适合的位字段放入下一个单元或重叠相邻单元是实现定义的。在一个单元内分配位字段的顺序(高阶到低阶或低阶到高阶)是实现定义的。可寻址存储单元的对齐未指定。
https://stackoverflow.com/questions/57307550
复制相似问题