在C语言的struct中,":"表示位字段。

11

可能是重复问题:
What does 'unsigned temp:3' means

  struct Test
  {
      unsigned a : 5;
      unsigned b : 2;
      unsigned c : 1;
      unsigned d : 5;
  };

  Test B;
  printf("%u %u %u %u", B.a, B.b, B.c, B.d); // output: 0 0 0 0
  static struct   Test A = { 1, 2, 3, 4};

请问有人能解释一下在struct中:的作用是什么吗?printf输出了0,所以我猜这不是默认值,那它们是什么呢?

还有,为什么A.a, A.b, A.c, A.d输出的是1, 2, 1, 4而不是1, 2, 3, 4呢?

3个回答

20

这是一个位域

它基本上告诉编译器:嘿,这个变量只需要 x 位宽度,所以按照此方式打包其余字段,好吗


2
这些是位字段,请参见C语言位字段维基百科部分或这个位字段的参考资料。 :后面的数字表示您想要为左侧标识符保留多少位。这允许您通过紧密打包数据来分配比通常情况下更少的空间。您只能在structunion中这样做。
这里有一个关于位字段的简短教程

链接失效了。下次一定要链接到正确的文章部分。 - Richard J. Ross III
https://en.wikipedia.org/wiki/C_syntax#Bit_fields - jhenninger

0

简单解释:您可以指定变量的位数。(您无法指定比类型原始大小更多的位。)
编辑:您的第三个变量只打印1,因为它只有1个位来存储其数据。 因此,该值只能是01。 十进制值3用二进制格式表示为11。 因此,无论截断哪个位,您最终都将在变量中存储一个1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接