我有一个与结构体位域相关的问题,请看下面的内容,因为我对应该使用哪些关键字来最好地描述我的问题有点困惑:
背景:我正在编写用于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个最高有效位?(这有点违反直觉,你可能会认为最后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);
在我的这边运行良好,使用结构化方法似乎要快一些,而且更加直观和清晰,但我担心无法保证前6位被存储在结构体第二个位域“op”中。
#error
发出消息(如果它无法识别编译器)。 - Eric Postpischil