【问题标题】:Can bit-fields only be fields of a structure/union, never "normal", "stand-alone" variables?位字段只能是结构/联合的字段,而不是“正常”、“独立”变量吗?
【发布时间】:2013-05-04 10:49:20
【问题描述】:

位字段的字段部分似乎表明它们只能是结构或联合中的字段。

位域可以是典型的“独立”变量,在任何聚合数据类型(如联合或结构)之外,如下所示:

   int sum:6;   //Can this work as a declaration statement?
   sum=4;

如果不是,为什么会这样?如果位域基本上是为了使用更少的内存,那么如果我们知道它不会超过那个大小,为什么我们不能将任何变量声明为位域呢?

【问题讨论】:

  • 没有“独立”位域。这真的没有意义。您已经拥有所有可能大小的整数类型(例如uint8_t),并且“使用更少的位”没有任何好处。当使用任何不是机器字大小的东西时,寻址很可能更慢
  • @KerrekSB LOL,我通过评论得到了答案!

标签: c variables bit-fields


【解决方案1】:

位域只是结构或联合的一部分,因为这是 C standard 允许的。本来可以做出不同的决定。为什么委员会决定按现在的方式编写标准,你得问问他们。

要查找 C99 标准中的信息:

来自目录:

6.7 声明

6.7.2 类型说明符(好吧,这个有点晦涩)

6.7.2.1 结构和联合说明符。

一个位域是语法的declarator_opt : constant-expression 部分。这种语法只在这里被允许,结果是不能在别处声明位域。

语法告诉您,如果您对此类信息感到好奇,可以选择省略位字段的名称。第 6.7.2.1:3 条更进一步,禁止 0 长度位域的名称。

【讨论】:

  • Why the committee decided to write the standard the way it is, you would have to ask them.他在问我们!
【解决方案2】:

位字段只能在结构和联合中定义,它们可以通过名称单独引用。 您不能按位寻址内存,至少需要一个字节大小(8 位)。 为了逐位寻址变量,您可以使用如下掩码:

int num = 9;
int fourthBit = (num >> 4) & 1;

一个结构可以有更大的尺寸,例如一个 int(4 个字节),然后按位划分为不同的部分。当然,分配将使用掩码编译。

更多信息请参考:http://msdn.microsoft.com/en-us/library/yszfawxh(v=vs.80).aspx

【讨论】:

  • 即使在结构中使用位域时,也会使用一个字节的倍数。它永远不会像“2 字节和 5 位”。但是位域使我们能够使用 1、2、3 字节作为整数。那么为什么不能用它们来做与“独立”变量相同的事情呢?
  • 您的链接没有任何帮助。只是携带有关位域的已知内容,而不是我的问题的答案。
  • 我的回答是指您的第一个问题:“这可以作为声明声明吗”。至于你的第二个问题 - 为什么,我认为它与语言语法和语法规则有关。为了让您引用变量中的某个位,应该有某种语法来支持它,例如:num$bit4 或类似的东西。但是已经有一种语法可以做类似的事情,使用像这样的点:num.bit4 所以我猜他们使用了这个并且要求通过结构来引用变量中的位。我将尝试为此找到参考。
  • 我从来没有说过我的声明 int sum:6 期望比特!很明显,我期望 1 个字节,因为我本来希望它位于像 struct test{int sum:6}; 这样的结构中。
  • 在我的问题中我说我打算访问单个位?我说的是存储在位域中的变量。
【解决方案3】:

如果不是,为什么会这样?如果位域基本上是为了使用更少的内存,为什么我们不能>将任何变量声明为位域,如果我们知道它不会超过那个大小?

因为内存固定为 16 或 32 位宽。将用户 14 位整数打包成 16 位并使用其他 2 位会太慢。最好浪费 2 位,不要让您在有效存储中定义。这就是为什么如果你真的想要你可以使用工会。 通过使编译器更加努力地工作,您不会获得任何东西。编写编译器的人很聪明。他们不只是让一个有坏主意的程序员放慢速度,对不起/。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多