gpt4 book ai didi

c - 关于 true 的表示可以假设什么?

转载 作者:太空狗 更新时间:2023-10-29 17:21:55 24 4
gpt4 key购买 nike

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

我在 C 标准中找不到很多关于 _Bool 的陷阱表示的信息,我也找不到是否创建一个 _Bool 的表示不同于 01(在支持两种以上表示的实现上)是可以的,如果可以,那么这些表示是表示真还是假。

我在标准中可以找到的是当 _Bool 与整数进行比较时发生的情况,如果整数具有值 ,则整数将转换为 0 表示>0,如果 1 的值不为零,则为 1 表示,这样上面的代码片段最终比较两个具有不同表示的 _Bool: _ boolean [3] == _ boolean [1]

关于这种比较的结果是什么,我在 C 标准中找不到太多信息。由于 _Bool 是一个整数类型,我希望应用整数规则,这样相等比较仅在表示相等时才返回 true,而这里不是这种情况。

由于在我的平台上该程序返回 0,因此该规则似乎不适用于此处。

为什么这段代码会这样? (即我错过了什么?_Bool 的哪些表示是陷阱表示,哪些不是?有多少表示可以表示 truefalse ? 填充位在其中扮演什么角色?等)

对于 _Bool 的表示,可移植的 C 程序可以假设什么?

最佳答案

C11 标准中的脚注 122 说:

While the number of bits in a _Bool object is at least CHAR_BIT, the width (number of sign and value bits) of a _Bool may be just 1 bit.

因此,在 _Bool 只有一个值位的编译器上,当您从内存中将其作为 读取时,只有 char 的一位有效>_ boolean 。其他位是被忽略的填充位。

当我使用 GCC 测试您的代码时,_Bool 成员在将奇数分配给 u.c 时获得值 1,在分配偶数时获得 0,这表明它只查看最低位。

请注意,以上仅适用于类型双关语。如果您改为将 char 转换(隐式或显式转换)为 _Bool,如果 char 不为零,则该值将为 1。

关于c - 关于 true 的表示可以假设什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53979781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com