c - 应该使用类型转换来设置位域吗?

标签 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。

编辑 2:

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

最佳答案

这里不需要强制转换——只要符合规范的实现不应该破坏其他成员,分配就已经“安全”了。假设正常的整数溢出语义适用,唯一有问题的情况是有符号溢出,它可能发出一个信号(但如果位域宽度小于一个完整的宽度,我很难看到这种情况在实践中发生word 作为溢出检测的硬件支持将缺乏)并且在其他方​​面是实现定义的。此警告不适用于您的示例,因为目标类型是未签名的。

请记住,位域语义在很大程度上是由实现定义的——即使使用 int 以外的类型实际上也是一种语言扩展——你需要检查编译器是否按照你的期望进行操作它可以在所有相关平台上执行。

一种更便携但也不太方便的方法是只使用 uint32_t 并手动进行位操作。如果您不需要这种盈利能力,那么按原样应该没问题。

关于c - 应该使用类型转换来设置位域吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19242982/

相关文章:

c - 错误 Switch-Case - C 编程 - 初学者

c# - 仅在 3.5 中从 List<T> 到 IEnumerable<T> 的 InvalidCastException

java - 如何比较两个 long 的高 40 位

java - 使用异或平衡括号

c++ - 如何在 C/C++ 中开发独立于平台的电子书阅读器?

c - 此函数如何仅使用按位运算符对 3 个整数求和?

c - 如何优化KASUMI算法的S盒?

java - 如何将Object转换为 "original"类型

ios - 将 NSLocalizedString 传递给 NSObject 参数的 Swift 方法无法编译

c++ - 从 char 数组中提取十六进制数字