我在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)。
有人可以给出更详细的解释吗?
注意:标记c和c++都是必需的,因为它们描述位域的标准略有不同。查看C specification和C++ 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/