关于C结构的问题

时间:2009-06-17 15:54:38

标签: c

我一直认为我非常了解C,直到我在另一篇文章中看到类似的内容:

struct foo {
    int x:1;
};

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

4 个答案:

答案 0 :(得分:11)

位域。 x是1位长。

  

访问和操作每个字段   好像它是一个普通的成员   结构体。关键字签名和   无符号意味着你所期望的,   除了有趣的是要注意   两个上的1位有符号字段   补机只能拿   值0或-1。声明是   允许包括const和   挥发性资格。

     

位域的主要用途是   允许紧密包装数据或   能够指定某些字段   外部生成的数据文件。 C   不保证订购   机器词内的字段,所以如果你   为了后一个原因,请使用它们,你   程序不仅是不便携的,   它也将依赖于编译器。该   标准表示字段已打包   进入'存储单元',这是   典型的机器词。包装   顺序,以及是否是一个位域   可能会跨越存储单元边界   实施定义。强迫   对齐到存储单元边界,   在之前使用零宽度字段   一个你想要对齐的。

     

小心使用它们。它可能需要   惊人数量的运行时代码   你可以操纵这些东西   最终使用的空间比他们多   保存。

     

位字段没有地址 - 你   不能有指向它们或数组的指针   他们。

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

答案 1 :(得分:3)

这些是位字段。在结构中,您可以定义为变量分配的位数(覆盖变量类型的标准)

在上面的示例中,x仅使用1个字节,因此只能取值0或1.

请参阅the C book中的以下示例。点击链接获取更多信息。

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;

答案 2 :(得分:1)

这是一个1位长的字段。对wikipedia进行了很好的讨论。

答案 3 :(得分:0)

该语法用于表示位字段(即比数据类型本身更窄的位字段),因此示例中的“x”实际上是使用1位的int。

更有用的例子可能是

char x:4;
char y:4;

这会将两个4位字段打包成一个字节。 当然,优点是在每个字节都很重要的架构中节省空间。