该程序返回0
在我的机器上:
#include <stdbool.h>
union U {
_Bool b;
char c;
};
int main(void) {
union U u;
u.c = 3;
_Bool b = u.b;
if (b == true) {
return 0;
} else {
return 1;
}
}
AFAICT, _Bool
是一个整数类型,至少可以存储0
and 1
, and true
是积分常数1
。在我的机器上,_Bool
has a sizeof(_Bool) == 1
, and CHAR_BITS == 8
, 意思就是_Bool
有 256 个代表。
我在 C 标准中找不到太多关于陷阱表示的内容_Bool
,我找不到是否创建_Bool
具有不同的表示形式0
or 1
(在支持两种以上表示的实现上)是可以的,如果可以,则这些表示表示 true 还是 false。
我在标准中可以找到的是当_Bool
与一个整数进行比较,该整数被转换为0
代表是否有价值0
,并且到1
表示,如果它的值不为零,这样上面的代码片段最终会比较两个_Bool
s 具有不同的表示形式:_Bool[3] == _Bool[1]
.
我在 C 标准中找不到太多关于这种比较结果的信息。自从_Bool
是整数类型,我希望应用整数的规则,这样相等比较仅在表示相等时返回 true,但这里的情况并非如此。
由于在我的平台上该程序返回0
,看来这条规则在这里不适用。
为什么这段代码的行为是这样的? (即我错过了什么?哪些表示_Bool
哪些是陷阱表征,哪些不是?可以代表多少个表示true
and false
?填充位在此起什么作用? ETC。 )
可移植 C 程序可以假设什么表示_Bool
?
C11标准中的脚注122说:
虽然 _Bool 对象中的位数至少为 CHAR_BIT,但 _Bool 的宽度(符号和值位数)可能仅为 1 位。
所以在编译器上_Bool
只有一个值位,只有一位char
当你从记忆中读取它时就会生效_Bool
。其他位是被忽略的填充位。
当我用 GCC 测试你的代码时,_Bool
当向成员分配奇数时,成员的值为 1u.c
当分配偶数时为 0,表明它只查看最低位。
请注意,上述仅适用于类型双关。如果您改为转换(隐式或显式转换)achar
to a _Bool
,如果char
是非零的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)