我在this Quora post中看到了以下代码:

#include <stdio.h>

struct mystruct { int enabled:1; };
int main()
{
  struct mystruct s;
  s.enabled = 1;
  if(s.enabled == 1)
    printf("Is enabled\n"); // --> we think this to be printed
  else
    printf("Is disabled !!\n");
}

在C和C++中,代码的输出都是意外的,



尽管在那篇文章中给出了与“符号位”相关的解释,但我无法理解,我们可能会设置一些东西,然后又不能按原样反射(reflect)。

有人可以给出更详细的解释吗?

注意:标记cc++都是必需的,因为它们描述位域的标准略有不同。查看C specificationC++ specification的答案。

最佳答案

该标准对位字段的定义非常差。给定此代码struct mystruct {int enabled:1;};,那么我们不知道:

  • 这会占用多少空间-如果有填充位/字节以及它们在内存中的位置。
  • 该位在内存中的位置。没有定义,也取决于耐久性。
  • int:n位字段视为带符号的还是无符号的。

  • 关于最后一部分,C17 6.7.2.1/10说:



    解释上述内容的非规范性注释:



    如果将位字段视为signed int,并且您将其大小设置为1,则没有数据空间,仅用于符号位。这就是为什么您的程序可能在某些编译器上给出奇怪结果的原因。

    好的做法:
  • 切勿将位字段用于任何目的。
  • 避免将带符号的int类型用于任何形式的位操作。
  • 关于c++ - 为什么将值分配给位字段却没有返回相同的值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53853540/

    10-10 15:10