[英]Can a C++ compiler represent bool internally with something other than 0 or 1?
以下问题(和答案)表明转换为 int 时 bool 的值将是 0 或 1。
我的问题是编译器是否可以在内部将值表示为其他内容(直到转换)。 我模糊地回忆起 MSVC 调试器显示表示 bool 的字节的数值(如果它不是 0 或 1),我似乎记得有时会看到 255(0xFF)。
换种说法,下面的代码是否可以返回 0 或 1 以外的其他值?
int boolval(bool z) {
return *(unsigned char *)&z;
}
我目前正在使用在结构中使用bool
的二进制格式,并且看到的是 255 而不是 0 和 1。
编辑:我刚刚发现了一个几乎相同的问题,所以我将它链接到这里以获取更多信息。 布尔值如何在内存中表示? 感谢您的回答。
只要1==(int)true
和0==(int)false
,编译器就可以表示 true
编译器满足这些要求的最简单方法是将false
表示为所有零位,将true
为最低有效位集,因为这样“转换”为int
不涉及更改任何内容。
但是编译器可以自由地将true
表示为所有位设置,并发出指令在转换为int
时将其转换为1
,甚至将true
表示为所有零位,将false
为所有位设置或任何其他奇数表示,只要它符合要求。
[basic.fundamental]/6:
类型
bool
, [...] 统称为整型。 整数类型的同义词是整数类型。
整数类型的表示应使用纯二进制计数系统定义值。
这是模糊的。 标准绝不要求false
和true
对应于内存中的0
或1
(也可以相反)。 我们所知道的是,表示显然不会改变,因此您将获得一致的结果。
但是,以下规则适用于x86_64 处理器特定的 ABI :
布尔值在存储在内存对象中时,存储为单字节对象,其值始终为 0(假)或 1(真)。 当存储在整数寄存器中或作为参数传递到堆栈时,寄存器的所有 8 个字节都是有效的; 任何非零值都被认为是真的。
该 ABI 的值将为0
为false
,任何为true
。 在这种情况下,不能保证从您的函数返回哪个值。
这个问题有两个部分:
1) 编译器实际上是做什么的?
bool ok = res;
确定将具有 res 的任何价值。2)标准怎么说?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.