我想从 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/

10-13 03:33