2009-06-17 85 views
4

我一直以为我知道ç非常好,直到我看到在另一篇文章是这样的:关于产品碳构建

struct foo { 
    int x:1; 
}; 

我真的想知道的目的:1。有人能告诉我吗?谢谢。

回答

11

bitfield。 x是1位长。

每个字段访问和操作 ,好像它是一个 结构的普通构件。有符号的关键字和 无符号意味着你期望的, ,只是有趣的是注意 一个两个的 补充机器上的1位有符号字段只能取 值0或-1。这些声明允许包含const和 易失性限定符,其中声明为 。

主要使用位域的要么是 允许数据的紧密堆积或以 能够指定内的一些 外部产生的数据文件的字段。 C 不能保证机器字内的 字段的顺序,所以如果你使用 后面的原因,你的程序将不仅仅是不可移植的,它也会依赖于编译器。 标准表示字段被打包为'存储单元',其中 通常是机器字。包装 的顺序以及位域 是否可能跨越存储单元边界,都是 实现定义的。要强制 与存储单元边界对齐,请使用 零宽度字段,然后在想要对齐的 之前使用零宽度字段。

小心使用它们。它可能需要 令人惊讶的运行时间代码量 来操纵这些东西,并且您可以使用更多的空间比使用 保存更多的空间。

位域没有地址 - 您的 不能有指向它们的指针或它们的数组 。

http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html

+0

谢谢!但是这只是将它声明为一个常规整数有什么好处? – 2009-06-17 15:58:26

0

即语法用于表示位字段(即比特比数据类型本身窄的场),所以在您的示例中的“X”是真正使用int的1个比特。

一个更有用的例子可能是这样的

char x:4; 
char y:4; 

这将打包两个4位字段为一个字节。当然,优点是节省每个字节都很关键的体系结构中的空间。

1

这是一个1位长的字段。关于wikipedia有一个很好的讨论。

3

这些是位域。在结构中可以定义多少位分配给变量(覆盖的变量类型的标准)在上述X,仅使用1个字节的示例

,因此只能采取的值0或1。

请参阅​​中的以下示例。请点击链接了解更多信息。

struct { 
     /* field 4 bits wide */ 
     unsigned field1 :4; 
     /* 
     * unnamed 3 bit field 
     * unnamed fields allow for padding 
     */ 
     unsigned  :3; 
     /* 
     * one-bit field 
     * can only be 0 or -1 in two's complement! 
     */ 
     signed field2 :1; 
     /* align next field on a storage unit */ 
     unsigned  :0; 
     unsigned field3 :6; 
}full_of_fields;