C++ Can a C++;编译器是否在内部用0或1以外的内容表示布尔?
以下问题(和答案)表明布尔值在转换为int时将为0或1 我的问题是编译器是否可以在内部将值表示为其他内容(直到转换)。我模模糊糊地回忆起MSVC调试器显示表示布尔值的字节的数值,如果它不是0或1,我似乎记得有时会看到255(0xFF) 换言之,下面的代码是否可以返回0或1以外的内容 我目前正在使用一种二进制格式,该格式在结构中使用C++ Can a C++;编译器是否在内部用0或1以外的内容表示布尔?,c++,C++,以下问题(和答案)表明布尔值在转换为int时将为0或1 我的问题是编译器是否可以在内部将值表示为其他内容(直到转换)。我模模糊糊地回忆起MSVC调试器显示表示布尔值的字节的数值,如果它不是0或1,我似乎记得有时会看到255(0xFF) 换言之,下面的代码是否可以返回0或1以外的内容 我目前正在使用一种二进制格式,该格式在结构中使用bool,看到的是255,而不是0和1 编辑:我刚才发现了一个几乎相同的问题,所以我将其链接到这里以获取更多信息。 谢谢你的回答。只要1==(int)true和0=
bool
,看到的是255,而不是0和1
编辑:我刚才发现了一个几乎相同的问题,所以我将其链接到这里以获取更多信息。
谢谢你的回答。只要
1==(int)true
和0==(int)false
编译器满足这些要求的最简单方法是将false
表示为所有零位,将true
表示为最低有效位集,因为这样到int
的“转换”就不涉及任何更改
但编译器可以自由地将true
表示为所有设置的位,并发出指令,在转换为int
时将其转换为1
,甚至将true
表示为所有零位,将false
表示为所有设置的位或任何其他奇数表示,只要满足要求。[基础.基本]/6:
类型bool
,[…]统称为整型。同义词
对于整数类型,是整数类型。整数的表示形式 类型应使用纯二进制计数系统定义值。 这是模糊的。该标准绝不要求
false
和true
在内存中对应0
或1
(可能是另一种方式)。我们知道的是,表示形式显然没有改变,因此您将获得一致的结果
但是,以下规则适用于:
布尔值存储在内存对象中时,存储为单字节
对象的值始终为0(false)或1(true)。当
存储在整数寄存器中或作为参数在堆栈上传递,所有8
寄存器的字节是有效的;任何非零值都会被考虑
正确。
对于
false
,该ABI的值将为0
,对于true
的值将为任何值。在这种情况下,无法保证函数将返回哪个值。此问题有两个部分:
1) 编译器实际上做什么
- 所有主要编译器当前都将false表示为0
- 但是,有些编译器并不总是将true表示为1,
而是来源所具有的任何价值,因此在
ok将具有res拥有的任何值bool ok=res;
- 不保证
bool
内存表示是实现定义的,我将尝试为此找到一个标准引用。bool
s位字段是否有可能?您不是在回答您自己的问题吗?@filmor,“实现定义”意味着实现必须记录其选择,可能您的意思是未指定(无需记录)是的,它可以,但在实践中,您找不到使用0和1以外的任何东西的编译器。由于UB,可能会出现其他值。这对于x86 psABI是正确的(参见第13页,尽管它说所有位对于参数都是有效的,任何非零值都是真的),我不知道MS编译器是否使用了这种ABI。好吧,这些规则与x86无关:你可以在x86上编写不遵循这些规则的实现,你可以在所有其他遵循这些规则的系统上编写实现……这完全取决于你使用的ABI。@JonathanWakely啊,就是这样。我会纠正我的answer.Oops,对不起,我想说的是x86_64 psABI。Intel386 psABI似乎根本没有提到bool
。嗯,你怎么能指望false被表示为0呢?@LightnessRacesinOrbit你不能,我重新制定了那部分
int boolval(bool z) {
return *(unsigned char *)&z;
}