应该用于设置位域的转换?

时间:2013-10-08 08:42:48

标签: c casting bit

我们假设,我有以下结构:

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函数中使用类型转换来保证安全吗?

修改

该结构应该发送给HW。

EDIT2:

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

1 个答案:

答案 0 :(得分:2)

不需要在这里进行投射 - 如果符合要求的实施不应该破坏其他成员,则任务已经是“安全的”。假设应用正常的整数溢出语义,唯一有问题的情况是有符号溢出,可能引发一个信号(但是如果位字段宽度小于满的话,我很难看到在实践中发生这种情况这个词作为harware支持溢出检测将缺乏),并且在其他方​​面是实现定义的。此警告不适用于您的示例,因为目标类型是无符号的。

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

一种更便携但也不太方便的方法是使用uint32_t并手动进行小提示。如果你不需要这种可持续性,那就应该没问题了。