【问题标题】:How does this litle program work?这个小程序是如何工作的?
【发布时间】:2018-06-12 23:34:12
【问题描述】:

我试图检查关于 C++ 的 QA 练习,但一个问题让我发疯了!!

typedef struct {
    unsigned int i : 1;
} myStruct;

int main()
{
    myStruct s;
    s.i = 1;
    s.i++;
    cout << s.i;
    return 0;
}

问题说输出是什么:0/1/2/3/-1/Seg Error?

我确实检查了 2 这是一个错误答案 :D ,那么为什么程序显示 0

【问题讨论】:

  • 它是一个 1 位整数。如果你增加 1,它会回到 0。
  • unsigned int i : 1; 是一个长度为 1 位的位域。有效值为 0 和 1。如果将其设置为 1,然后将其递增,您会得到什么?
  • 谨慎对待提供“Seg 错误”等答案的问题。如果你总是在你认为会得到的地方得到这些,那么调试会容易得多。
  • 是的。通常情况下,您会将多个位打包到 unsigned int 的 32 位中。例如:struct myStruct{ unsigned int i : 1; unsigned int j : 3; }; 会在相同的 32 位中为您提供结构的两个成员。一个需要 1 位,另一个需要 3。顺便说一句:您不需要 C++ 中的 typedef
  • 等一下。我可能误解了你。如果sizeof(unsigned int) 为4,那么sizeof(myStruct) 也将为4。其他31 位未使用。如果您移植到 int 为 64 位的环境,那么您将有 63 位未使用。这些 32 位或 64 位可以按您喜欢的方式细分。

标签: c++ struct bit-fields


【解决方案1】:

您需要熟悉bitfields

默认情况下,int 的大小为 32 位(4 字节)。但是使用给定的符号,您可以指定变量使用多少位。

所以当你从 1 开始增加值时,它会溢出并返回到零。

【讨论】:

猜你喜欢
  • 2012-08-27
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 2023-04-11
相关资源
最近更新 更多