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
请参考上面的代码解释":"运算符的含义,以及这种奇怪输出的原因;
这些表示位字段,其长度在冒号后面表示
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字节)的原因是编译器还根据位域的底部类型对齐某些边界上的结构.例如,改变int为short或者char作为位域的基础类型将分别减少clap到2和1字节的总大小(再次在gcc 4.7上).
这应该与存储3个完整整数进行比较,通常需要12个字节(如果int是4个字节).OTOH,位字段可以使代码变慢,因为寻址成员需要移位和解包位域.
出现符号问题是因为2的2位二进制补码等于-2.将代码扩展为int j:3将输出2.
| 归档时间: |
|
| 查看次数: |
985 次 |
| 最近记录: |