【发布时间】:2013-07-09 06:24:49
【问题描述】:
我想从 32 位寄存器中读取第 2、第 5 和第 6 位。我决定使用 struct bit fields 来存储它们。下面的数据结构正确吗?
struct readData
{
int unwanted:1;
int reqbit1:1;
int unwanted1:2;
int reqbit2:2;
int unwanted2:26;
};
我不确定位域是如何创建的。我将使用一个 API,它将字节从 h/w 寄存器直接复制到这个结构中。在那种情况下, reqbit1 会包含第二位吗?根据我的理解,编译器将第一位分配给一个 int 变量,第二位分配给另一个 int 变量,因此 reqbit1 不会从寄存器读取任何数据。下面的联合不是更适合这种情况吗?
union readData
{
struct readBits
{
bool unwanted:1;
bool reqbit1:1;
xxx unwanted1:2;
short reqbit2:2;
xxx unwanted2:26;
};
int regValue;
};
如果这是正确的,我应该将不需要的 2 声明为什么?
【问题讨论】:
-
使用 1 位有符号位域通常是一个非常糟糕的主意。您可以在那里存储的值将只是
-1或0,这只是令人困惑。让他们unsigned。 -
@unwind 如果我只是将结构中的所有 int 更改为 unsigned int,可以吗?我不必使用联合来读取寄存器吗?
标签: c bit-manipulation bitwise-operators unions bit-fields