关于真实的表示可以假设什么?

gnz*_*lbg 6 c boolean

这个程序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是一种整数类型,至少可以存储01,并且true是整数常量1.在我的机器上,_Bool有一个sizeof(_Bool) == 1,和CHAR_BITS == 8,这意味着_Bool有256个表示.

我在C标准中找不到关于陷阱表示的更多内容_Bool,我无法找到创建_Bool一个表示不同于01(在支持两个以上表示的实现上)是否正常,如果可以,这些陈述是表示真或假.

我可以在标准的发现是什么情况,当_Bool与整数相比,整数转换成0它是否有值表示0,并给1它是否有不为零的值,使得片段上方结束表示将两个_Bools与不同的表示进行比较:_Bool[3] == _Bool[1].

关于这种比较的结果,我在C标准中找不到多少.既然_Bool是整数类型,我希望应用整数规则,这样如果表示相等,则相等比较仅返回true,这不是这里的情况.

因为在我的平台上这个程序返回0,所以看起来这个规则不适用于此.

为什么这段代码表现得像这样?(即我错过什么?哪个表述_Bool是陷阱表示,哪些不是?多少表示可以代表truefalse?不填充比特扮演了什么角色进入这个?等等)

便携式C程序可以假设什么代表_Bool

int*_*jay 7

C11标准中的脚注122说:

虽然_Bool对象中的位数至少为CHAR_BIT,但_Bool的宽度(符号和值位数)可能只有1位.

因此,在_Bool只有一个值位的编译器上,char当你从内存中读取它时,只有一个位会生效_Bool.其他位是填充位,被忽略.

当我使用GCC测试代码时,_Bool成员在分配奇数时获得值1,在分配偶数时获取u.c0,表明它只查看最低位.

请注意,以上情况仅适用于类型惩罚.如果您将(隐式或显式转换)a转换char为a _Bool,则该值将为1(如果char非零).

  • @gnzlbg它在GCC中只有1位的值(您可以通过尝试使用`_Bool b:2`字段创建一个位域来检查这一点,该字段失败).但其他表示不一定是陷阱表示:未使用的位是填充位,可以具有任何值.所以0和1值有很多可能的表示.编译器可以将填充位的某些组合定义为陷阱表示,但它看起来不像GCC那样. (2认同)