位字段的字段部分似乎表明它们只能是结构或联合中的字段。
位字段是否可以是典型的“独立”变量,位于任何聚合数据类型之外,如以下联合或结构:
int sum:6; //Can this work as a declaration statement?
sum=4;若否,原因为何?如果位域基本上打算使用更少的内存,为什么我们不能将任何变量声明为位域,如果我们知道它不会超过那个大小的话?
发布于 2013-05-04 20:47:52
位域只是结构或联合的一部分,因为这是C standard允许的。可能会有不同的决定。为什么委员会决定以这种方式编写标准,你必须问他们。
要查找C99标准中的信息:
从目录中:
6.7声明
6.7.2类型说明符(好的,这个有点晦涩)
6.7.2.1结构和联合说明符。
一个比特字段是语法的declarator_opt : constant-expression部分。这种语法只允许在这里使用,其结果是不能在其他地方声明位字段。
语法告诉您,如果您对这种信息感兴趣,可以选择性地省略位字段的名称。第6.7.2.1:3条更进一步,禁止使用长度为0的位域命名。
发布于 2013-05-04 18:58:14
位字段只能在结构和联合中定义,在结构和联合中,它们可以通过名称单独引用。您不能按位寻址内存,至少需要一个字节大小(8位)。为了逐位寻址变量,您可以使用如下掩码:
int num = 9;
int fourthBit = (num >> 4) & 1;结构可以具有更大的大小,例如int (4字节),然后按位划分为不同的部分。当然,赋值将使用掩码进行编译。
有关更多信息,请参阅:http://msdn.microsoft.com/en-us/library/yszfawxh(v=vs.80).aspx
发布于 2014-01-05 12:42:01
如果没有,原因是什么?如果位域基本上打算使用更少的内存,那么如果我们知道任何变量不会超过位域的大小,为什么我们不能>将它声明为位域呢?
因为存储器固定在16或32位宽。将用户的14位整数打包成16位并使用其他2位太慢了。最好是浪费这2位,不要让你在有效的存储中定义。这就是为什么如果你真的想要,你可以使用一个联合。通过让编译器无偿地更加努力地工作,你不会得到任何东西。编写编译器的人很聪明。他们不会让一个有坏主意的程序员让事情慢下来,对不起/。
https://stackoverflow.com/questions/16373465
复制相似问题