位字段的字段部分似乎表明它们只能是结构或联合内的字段。
比特字段可以是典型的“独立”变量,在任何聚合数据类型之外,如union或结构,如下所示:
int sum:6; //Can this work as a declaration statement?
sum=4;
如果没有,为什么呢?如果位域基本上是为了使用更少的内存,为什么我们不能将任何变量声明为位字段,如果我们知道它不会超过那个大小?
答案 0 :(得分:3)
位域只是结构或联合的一部分,因为这是C standard允许的。本来可以做出不同的决定。为什么委员会决定按照原样编写标准,你必须问他们。
要查找C99标准中的信息:
从目录:
6.7声明
6.7.2类型说明符(好吧,这个有点模糊)
6.7.2.1结构和联合说明符。
一个位字段是语法的declarator_opt : constant-expression
部分。这里只允许使用这种语法,结果就是不能在别处声明位字段。
语法告诉您,如果您对此类信息感到好奇,可以选择省略位字段的名称。条款6.7.2.1:3更进一步,禁止0长度位字段的名称。
答案 1 :(得分:0)
位字段只能在结构和联合中定义,它们可以通过名称单独引用。 您不能按位寻址存储器,至少需要一个字节大小(8位)。 为了逐位寻址变量,您可以使用如下掩码:
int num = 9;
int fourthBit = (num >> 4) & 1;
结构体可以具有更大的尺寸,例如int(4个字节),然后按位分割成不同的部分。当然,分配将使用掩码进行编译。
有关详细信息,请参阅此处:http://msdn.microsoft.com/en-us/library/yszfawxh(v=vs.80).aspx
答案 2 :(得分:0)
如果没有,为什么呢?如果位域基本上打算使用更少的内存,为什么我们不能将任何变量声明为位字段,如果我们知道它不会超过那个大小?
因为内存固定为16或32位宽。将用户14位整数打包成16位并使用其他2位将太慢。最好浪费2位,不要让你在高效存储中定义。这就是为什么如果你真的想要你可以使用工会。 你不会通过让编译器更加努力地工作而获得任何东西。编写编译器的人很聪明。他们不只是让一个有坏主意的程序员放慢速度,抱歉/。