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
大小。