C++ 解释“的用法:&引用;c+中的运算符+;在代码片段中;国际一级:2&引用;

C++ 解释“的用法:&引用;c+中的运算符+;在代码片段中;国际一级:2&引用;,c++,operators,puzzle,bit-fields,twos-complement,C++,Operators,Puzzle,Bit Fields,Twos Complement,可能重复: 下面的C++代码< /P> # include <stdio.h> int main() { struct clap { int i:2; int j:2; int k:3; }x={1,2,3}; printf("%d %d %d",x.i,x.j,x.k); return 0; } #包括 int main() { 结构片 { 国际一级:2; int j:2; INTK:3; }x={1,2,3}; printf(“%d

可能重复:

<>下面的C++代码< /P>
# include <stdio.h>
int main()
{
  struct clap
  {
   int i:2;
   int j:2;
   int k:3;
   }x={1,2,3};

  printf("%d %d %d",x.i,x.j,x.k);

  return 0;
}
#包括
int main()
{
结构片
{
国际一级:2;
int j:2;
INTK:3;
}x={1,2,3};
printf(“%d%d%d”,x.i,x.j,x.k);
返回0;
}
在运行下面的代码时,我得到了输出 1-2 3


请参照上述代码解释“:”运算符的含义,以及这种奇怪输出的原因

结构中的冒号表示成员是位字段。也就是说,每个字段只使用指定数量的位


字段
j
得到
-2
,可能是因为
printf
将is视为符号扩展整数。

这些表示长度在冒号后的位字段

  struct clap
  {
   int i:2; // length 2
   int j:2; // length 2
   int k:3; // length 3
   };
位字段节省空间。尝试计算
sizeof(clap)
,您会发现它在GCC4.7上是4个字节。它不是1字节(2+2+3=7位<1字节)的原因是编译器还根据位字段的欠列类型在某些边界上对齐结构。例如,将
int
更改为
short
char
作为位字段的基本类型,将
clap
的总大小分别减少到2字节和1字节(再次在gcc 4.7中)

这应该与存储3个完整整数进行比较,通常需要12个字节(如果整数是4个字节)。此外,位字段会使代码变慢,因为寻址成员需要移位和解包位字段

出现符号问题是因为2的2位等于-2。将代码扩展到
intj:3
将输出
2

,这就是所谓的

更新:


x.j
打印为
-2
的原因是:
x.j
是2,但它只有2位,较高的位是1,这将被
printf
%d
格式作为符号位。要验证这一点,只需将
%d
更改为
%u
,然后看看会发生什么

像其他答案一样,它是位域。 关于它们的一个重要注意事项是:

因此,C++0x在一个连续的字段中处理所有(非零长度)位字段 作为单个存储器位置一部分的位字段序列;一 对一方的分配与对任何其他方的分配冲突。 这样的连续位字段不应该由 不同的线程。通常这意味着它们应该受到保护 单锁


我的答案有什么问题?不是我的反对票,但我想你需要更多描述,而不是简短的回答。但我给了一个指向维基百科的链接。链接很好,但答案本身仍然没有包含太多信息:仍然太短。你需要解释它是什么,如何使用它,用例,副作用等。然后它成为一个很好的答案。享受你的时间。可能的重复:谢谢你,它解决了我的问题假设你的理由是真的,那么它应该给-3输出值的k。我说的对吗?j有2位,10,最高的是1,这是负数。k有3位,011,最高为0,这是非负的。运行代码时,clap的大小为4。请解释它是如何产生的?您可以使用short而不是int来更改基础类型,并查看差异。@amol\u beast clap的大小至少是基础位字段类型的大小。例如,只有
inti:1
作为结构成员,已经给出了等于4字节的
clap
大小。