【发布时间】:2015-05-28 21:22:16
【问题描述】:
我需要读取一个十六进制格式的 32 位地址(例如:0129ef12)并将 32 位分成 6-5-5-16 个数据包,分别代表 Opcode-Rd-Rs-Immediate。
这是我目前所拥有的:
typedef unsigned char u8;
typedef unsigned short u16;
union {
unsigned int address;
struct {
u16 imm : 16;
u8 rs : 5;
u8 rd : 5;
u8 opcode : 6;
} i;
} InstRead;
InstRead.address = 0x0129ef12;
cout << hex << int(InstRead.i.opcode) << "\n";
cout << hex << int(InstRead.i.rs) << "\n";
cout << hex << int(InstRead.i.rd) << "\n";
cout << hex << int(InstRead.i.imm) << "\n";
但是,这并没有给出正确的输出...即位不是由我指定的长度 6-5-5-16 选择的...我做错了什么?
【问题讨论】:
-
你得到什么输出?您是否尝试过逐步调试?
i成员的值是否正确? -
你用的是什么编译器?位字段处理不是标准化的,由编译器来实现。可能是将您指定的那些位字段填充到最近的边界。事实上,如果不是,我会感到惊讶。
-
这里的字节序不是问题吗?