以下问题(和答案)表明转换为int时bool的值为0或1。
Is C/C++ bool type always guaranteed to be 0 or 1 when typecast'ed to int?
我的问题是编译器是否可以将值表示为内部的其他内容(直到转换)。我隐约回想起MSVC调试器显示表示bool的字节的数值,如果它不是0或1,我似乎记得有时看到255(0xFF)。
不同地说,以下代码可以返回0或1以外的其他内容吗?
int boolval(bool z) {
return *(unsigned char *)&z;
}
我目前正在使用二进制格式,在结构中使用bool
,我看到的是255而不是0和1。
答案 0 :(得分:7)
只要1==(int)true
和0==(int)false
编译器满足这些要求的最简单方法是将false
表示为所有零位,并将true
表示为最低有效位集,因为那时"转换"至int
并不涉及任何改变。
但是编译器可以自由地将true
表示为所有位设置,并在转换为1
时发出将其转换为int
的指令,甚至代表true
作为所有位的所有零位和false
或任何其他奇数表示,只要它满足要求。
答案 1 :(得分:4)
[basic.fundamental] / 6:
类型
bool
,[...]统称为整数类型。同义词 对于整数类型是整数类型。
积分的表示 类型应使用纯二进制计算系统定义值。
这很模糊。标准绝不要求false
和true
与内存中的0
或1
相对应(可能是相反的方式)。我们所知道的是,代表性显然不会改变,因此您将获得一致的结果。
但是,以下规则适用于x86_64 processor specific ABI:
布尔值存储在内存对象中时,存储为单字节 对象的值始终为0(false)或1(true)。 :当 存储在整数寄存器中或作为参数传递到堆栈上,全部为8 寄存器的字节很重要;考虑任何非零值 真。强>
该ABI的值将为0
的{{1}}以及false
的任何值。在这种情况下,无法保证从您的函数返回哪个值。
答案 2 :(得分:0)
这个问题分为两部分:
1)编译器实际上做了什么?
bool ok = res;
确定将拥有res所具有的任何价值。2)标准说什么?