我想从 32 位寄存器中读取第 2、第 5 和第 6 位。我决定使用结构位域来存储它们。以下数据结构是否正确?
struct readData
{
int unwanted:1;
int reqbit1:1;
int unwanted1:2;
int reqbit2:2;
int unwanted2:26;
};
我不确定位域是如何创建的。我将使用一个 API,它将字节从 h/w 寄存器直接复制到这个结构。在这种情况下,reqbit1 会包含第 2 位吗?根据我的理解,编译器将第一位分配给 int 变量,将第二位分配给另一个 int 变量,因此 reqbit1 不会从寄存器中读取任何数据。下面的 union 不是更适合这种情况吗?
union readData
{
struct readBits
{
bool unwanted:1;
bool reqbit1:1;
xxx unwanted1:2;
short reqbit2:2;
xxx unwanted2:26;
};
int regValue;
};
如果这是正确的,我应该将不想要的 2 声明为什么?
最佳答案
来自 C 标准:“单元内位域的分配顺序(高阶到低阶或低阶到高阶)是实现定义的。”
所以你不应该在顺序重要的地方使用位域。
改用显式屏蔽和移位:
reqbit1 = (w >> 1) & 1;
reqbit2 = (w >> 4) & 3;
或者
reqbit1 = (w & 0x00000002) >> 1;
reqbit2 = (w & 0x00000010) >> 4;
另一个方向
w = (reqbit1 << 1) | (reqbit2 << 4);
“不需要的”部分通常命名为
reserved1
等。关于c - 用于从 H/W 寄存器读取的位域,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17541370/