这个程序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
它是否有不为零的值,使得片段上方结束表示将两个_Bool
s与不同的表示进行比较:_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.c
0,表明它只查看最低位.
请注意,以上情况仅适用于类型惩罚.如果您将(隐式或显式转换)a转换char
为a _Bool
,则该值将为1(如果char
非零).