在代码片段"int i:2;"中解释在c ++中使用":"运算符

amo*_*ast 3 c++ puzzle operators twos-complement bit-fields

可能重复:
这个C++代码是什么意思?

在以下C++代码中

# 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;
}
Run Code Online (Sandbox Code Playgroud)

在运行以下代码时,我得到输出1 -2 3

请参考上面的代码解释":"运算符的含义,以及这种奇怪输出的原因;

Tem*_*Rex 8

这些表示位字段,其长度在冒号后面表示

  struct clap
  {
   int i:2; // length 2
   int j:2; // length 2
   int k:3; // length 3
   };
Run Code Online (Sandbox Code Playgroud)

Bitfields节省空间.尝试计算sizeof(clap),你会发现它在gcc 4.7上是4个字节.它不是1字节(2 + 2 + 3 = 7位<1字节)的原因是编译器还根据位域的底部类型对齐某些边界上的结构.例如,改变intshort或者char作为位域的基础类型将分别减少clap到2和1字节的总大小(再次在gcc 4.7上).

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

出现符号问题是因为2的2位二进制补码等于-2.将代码扩展为int j:3将输出2.


Som*_*ude 5

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

你得到-2的字段j可能是因为printftreats是一个符号扩展的整数.