这个程序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;
}
}
Run Code Online (Sandbox Code Playgroud)
AFAICT _Bool是一种整数类型,至少可以存储0和1,并且true是整数常量1.在我的机器上,_Bool有一个sizeof(_Bool) == 1,和CHAR_BITS == 8,这意味着_Bool有256个表示.
我在C标准中找不到关于陷阱表示的更多内容_Bool,我无法找到创建_Bool一个表示不同于0或1(在支持两个以上表示的实现上)是否正常,如果可以,这些陈述是表示真或假.
我可以在标准的发现是什么情况,当_Bool与整数相比,整数转换成0它是否有值表示0,并给1它是否有不为零的值,使得片段上方结束表示将两个_Bools与不同的表示进行比较:_Bool[3] == _Bool[1].
关于这种比较的结果,我在C标准中找不到多少.既然_Bool是整数类型,我希望应用整数规则,这样如果表示相等,则相等比较仅返回true,这不是这里的情况.
因为在我的平台上这个程序返回0,所以看起来这个规则不适用于此.
为什么这段代码表现得像这样?(即我错过什么?哪个表述_Bool是陷阱表示,哪些不是?多少表示可以代表true和false?不填充比特扮演了什么角色进入这个?等等)
便携式C程序可以假设什么代表_Bool?
C11标准中的脚注122说:
虽然_Bool对象中的位数至少为CHAR_BIT,但_Bool的宽度(符号和值位数)可能只有1位.
因此,在_Bool只有一个值位的编译器上,char当你从内存中读取它时,只有一个位会生效_Bool.其他位是填充位,被忽略.
当我使用GCC测试代码时,_Bool成员在分配奇数时获得值1,在分配偶数时获取u.c0,表明它只查看最低位.
请注意,以上情况仅适用于类型惩罚.如果您将(隐式或显式转换)a转换char为a _Bool,则该值将为1(如果char非零).