9

可能重复:
'unsigned temp:3' 是什么意思

  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};

有人可以解释一下:结构的目的是什么,printf只是输出0,所以我假设这些不是默认值,而是它们是什么?

也有人可以解释一下为什么A.a, A.b, A.c, A.d输出1, 2, 1, 4而不是1, 2, 3, 4

4

3 回答 3

19

那是一个位域

它基本上告诉编译器hey, this variable only needs to be x bits wide, so pack the rest of the fields in accordingly, OK

于 2012-06-25T21:58:10.473 回答
2

这些是位域,请参阅有关位域的维基百科部分或有关位域的参考

后面的数字:表示要为左侧的标识符保留多少位。与通常紧密打包数据的情况相比,这允许您分配更少的空间。您只能在structs 或unions 中执行此操作。

这是关于位域的简短教程。

于 2012-06-25T21:58:10.283 回答
0

简单的解释:你指定你的变量应该有多少位。(您不能指定比类型的原始大小更多的位。)
编辑:您的第三个变量只打印 1 因为它只1 bit需要存储其数据。所以值只能是0or 1。十进制值以二进制格式3表示。11因此,无论哪个位被截断,您最终都会1在变量中存储一个。

于 2012-06-25T21:58:52.537 回答