Possible Duplicate:
What does this C++ code mean?
在下面的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;
}
在运行以下代码时,我得到了输出
1 -2 3
请引用上述代码解释“:”运算符的含义,以及出现这种奇怪输出的原因;
这些表示位字段,长度在冒号之后表示
struct clap
{
int i:2; // length 2
int j:2; // length 2
int k:3; // length 3
};
位域节省空间。尝试计算 sizeof(clap)
,您会发现它在 gcc 4.7 上是 4 个字节。它不是 1 字节(2 + 2 + 3 = 7 位 < 1 字节)的原因是编译器还会根据位域的底层类型在特定边界上对齐结构。例如。将 int
更改为 short
或 char
作为位域的基础类型将分别减少 clap
的总大小2 和 1 个字节(再次在 gcc 4.7 上)。
这应该与存储 3 个完整整数通常需要 12 个字节(如果 int 是 4 个字节)相比。 OTOH,位域会使您的代码变慢,因为寻址成员需要移动和解包位域。
出现符号问题是因为 2 位 two's complement 2 等于 -2。将代码扩展为 int j:3
将输出 2
。