我一直认为我非常了解C,直到我在另一篇文章中看到类似的内容:
struct foo {
int x:1;
};
我真的很想知道:1的目的。有人能告诉我吗?感谢。
答案 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位字段打包成一个字节。 当然,优点是在每个字节都很重要的架构中节省空间。