1

假设,我有以下结构:

struct my_struct {
    uint32_t bf1 : 3;
    uint32_t bf2 : 5;
    uint32_t bf3 : 16;
    uint32_t bf4 : 8;
};

和以下枚举:

enum bf1_values {
     Val1 = 0x0;
     Val2 = 0x4;
     Val3 = 0x7;
};

此外,bf1 的 getter 和 setter 函数:

uint32_t bf1_getter() {
    return global_struct.bf1; // cast value to (uint32_t)?
}


void bf1_setter(enum bf1_values val) {
    global_struct.bf1 = val; // cast enum to (uint32_t)?
}

为了安全起见,我应该在 getter 和 setter 函数中使用类型转换吗?

编辑:

该结构应该被发送到硬件。

编辑2:

我想要实现的是真正确定enum将正确写入位域,并从位域正确读取。

4

1 回答 1

2

无需在此处进行强制转换-只要符合要求的实现不应该破坏其他成员,分配就已经是“安全的”。假设应用正常的整数溢出语义,唯一有问题的情况是有符号溢出,这可能会引发一个信号(但如果位字段宽度小于一个完整的字,因为硬件支持溢出检测,我很难在实践中看到这种情况发生将缺少)并且是由实现定义的。此警告不适用于您的示例,因为目标类型是无符号的。

请记住,位字段语义在很大程度上是实现定义的——即使使用int实际上不是语言扩展的类型——并且由您来检查编译器是否在所有相关平台上执行您期望它执行的操作。

一种更便携但也不太方便的方法是只使用 anuint32_t并手动进行位摆弄。如果您不需要这种可移植性,那么它应该可以按原样进行。

于 2013-10-08T09:37:12.313 回答