struct abc
{
uint32 total;
union
{
uint32 a:8;
uint32 b:8;
uint32 c:16;
}
}
如果我更新或读取“ abc.b”,则控制器将读取整个32位并更新特定字节,还是直接读取并更新该字节?
C标准不控制如何访问内存,除了将对象声明为原子外,还施加了一些约束。通常使用字节,字或其他大小的内存访问来访问位字段还是对象,这完全取决于C实现(主要是编译器)和目标计算机。如果您对特定系统有疑问,则需要专门识别它,包括目标硬件,目标操作系统和所使用的C实现。
如果您尝试了问题中显示的代码,但没有看到预期的结果,则可能是因为您在union
而不是struct
中声明了位字段。在union
中声明成员会导致它们在内存中重叠; uint32 a:8
和uint32 b:8
将指代相同的8位,uint32 c:16
将使它们重叠。要单独布置它们,而不是重叠布置,请将union
更改为struct
。