C语言中位域的实际用途是什么?

时间:2013-08-15 08:31:21

标签: c struct bit-fields

我正在阅读C语言(法语),在一个段落中他们讨论了位字段,他们给出了以下示例,但没有太多解释:

struct register {
   unsigned int mask : 3;
   signed int privilege : 6;
   unsigned int : 6; /* not used */
   unsigned int ov : 1;
};
  1. 此定义在内存级别的结果是什么?

  2. 是否有任何教学理由在示例中命名结构register(这让我想起电子产品)?

  3. 为什么有人会声明一个成员,如#34;未使用"在示例中?

  4. 这种结构在实践中有什么好处?

  5. 为什么位字段没有地址?这是否符合注册表中的规范?

2 个答案:

答案 0 :(得分:2)

这在您要创建模块注册表的硬件中特别有用。

现在,Register中有bit-fieldsbits,其Register的大小可能不同。 因此,您创建了一个表示bit-fieldsstruct的结构。基本上硬件中的寄存器是存储模块信息的结构。

对于Ex,对于USB模块,USB硬件内的寄存器存储有关USB设备状态的信息以及许多其他内容。

bits内的数据成员的长度限制为uints(or any other primitive data types),而不是为bit-fields保留unsigned int : 6;,因为它占用的内存非常少。

此外,伪声明word aligned用于填充结构,以便根据机器体系结构,结构对象和访问是Register。因此,如果访问与处理器的字边界对齐,则对寄存器对象的访问不会消耗更多时间。基本上,如果字,半字或字节在处理器字大小的倍数的地址处对齐,则可以在一个步骤中非常有效地访问它。

例如,在您的情况下,16-bits6-bits并且它有3个位字段:mask,privilege和ov。而剩余的Register保留供将来使用。 这就是bit-position 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 --------------------------------------- |ov | reserved | privilege |mask| --------------------------------------- 的样子,

{{1}}

因此,通过制作16位大小的结构,可以在8,16,32位ALU的处理器上轻松访问此结构的对象

答案 1 :(得分:1)

可以使用与问题中的结构类似的结构的一个示例是模拟硬件寄存器的位(这可能是通过名称来判断该结构)。

对于许多小型可嵌入系统,可能存在可直接在存储器中寻址的硬件寄存器,因此可以使用这些结构直接在这些寄存器中访问位。