【发布时间】:2014-10-16 15:02:45
【问题描述】:
我是一名计算机科学专业的学生。
现在,我正在用 C 语言开发一个计算机架构项目,该项目模拟处理器。
指令的种类很多
31 27 26 22 21 17 16 0
---------------------------------------------------------------
| op | ra | rb | imm17 |
---------------------------------------------------------------
31 27 26 22 21 17 16 7 6 5 4 0
---------------------------------------------------------------
| op | ra | rb | imm10 | m | shamt |
---------------------------------------------------------------
31 27 26 22 21 0
---------------------------------------------------------------
| op | ra | imm22 |
---------------------------------------------------------------
所以,我想制作一个 C 结构,其中包含与每个元素对应的位域,例如 op、ra 等。
起初,我认为我可以使用联合和嵌套结构。
例如,我写了这样的代码:
struct instr_t {
union {
uint32_t imm22 : 22;
struct {
union {
uint32_t imm17: 17;
struct {
uint8_t shamt: 5;
uint8_t mode : 2;
uint16_t imm10 : 10;
};
};
uint8_t rb : 5;
};
};
uint8_t ra : 5;
uint8_t op : 5;
}
我预计 sizeof(struct instr_t) 的结果是 4,但实际是 12。
也许嵌套结构有一些填充。
所以,这是我的问题:
如何实现重叠的 C 位域?
或
有没有人可以推荐一种更好的方法来在 C 中实现多种类型的指令?
谢谢!
【问题讨论】:
-
为什么不使用单个无符号整数来保存您的位?
-
@JoeManiaci 我非常怀疑这一点。 :)
-
我认为 2501 的意思是使用 32 位整数并使用按位运算来设置您需要的值。
-
有一个
struct instr_t{...}和 4 个联合条目:一个 sub-struct{...} R、一个 sub-struct{...} I、一个 sub-struct{...} J和一个uint32_t asInt32。尔格:struct instr_t{union{struct{/* Fields of R-type */} R; struct{/* Fields of I-type */} I; struct{/* Fields of J-type */} J; uint32_t asInt32;};}; -
2 条建议!每个指令结构的按位运算和联合。谢谢你们。我更喜欢后一种:)
标签: c struct unions bit-fields