5

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

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

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

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

4

3 回答 3

4

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

要查找 C99 标准中的信息:

从目录:

6.7 声明

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

6.7.2.1 结构和联合说明符。

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

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

于 2013-05-04T12:47:51.877 回答
0

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

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

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

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

于 2013-05-04T10:58:13.970 回答
0

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

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

于 2014-01-05T04:42:01.230 回答