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

标签 c++ operators puzzle bit-fields twos-complement

<分区>

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 更改为 shortchar 作为位域的基础类型将分别减少 clap 的总大小2 和 1 个字节(再次在 gcc 4.7 上)。

这应该与存储 3 个完整整数通常需要 12 个字节(如果 int 是 4 个字节)相比。 OTOH,位域会使您的代码变慢,因为寻址成员需要移动和解包位域。

出现符号问题是因为 2 位 two's complement 2 等于 -2。将代码扩展为 int j:3 将输出 2

关于c++ - 在代码片段 ":"中解释 C++ 中 "int i:2;"运算符的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14337687/

相关文章:

c++在一个类中使用模板和虚方法

c++ - 如何通过 google glog 打印完整的 double

c++ - 按成员降序对多个对象进行排序?

c++ - 运算符关键字 - 请解释这一行

algorithm - "The Social Network"编程难题

java - 为什么下面的 Java 程序会给出奇怪的输出?

c++ - 如何复制/设置 volatile std::string?

Java int += double 语法惊喜

c - scanf 函数是否会导致运算符出现任何逻辑问题?

c++ - 实现 15 拼图算法的正确方法是什么?