【发布时间】:2019-08-01 11:02:11
【问题描述】:
我有一个与结构位字段相关的问题,请参阅下文,因为我对应该使用哪些关键字来最好地描述我的问题有点不知所措:
上下文:我正在为 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 位存储在 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”。
【问题讨论】:
标签: c structure mips endianness mips32