我无法溢出bool变量变为零。 bool类型的变量是1个字节长,所以我认为当变量存储256时它会溢出,但它不像我预期的那样。
#include<iostream>
int main()
{
bool b = 0;
std::cout << sizeof(b) << std::endl; // the result is 1 byte
std::cout << b << std::endl; // the result is 0
b = 256;
std::cout << b << std::endl; // the result is 1,rather than the desired zero
return 0;
}
也许我没有说清楚只有1个字节,0和256都存储为00000000(二进制)
答案 0 :(得分:8)
将数字类型转换为bool
的规则很简单:零变为false
,所有其他值变为true
。这两种类型的大小和布局都无关紧要。
如果你想要它在Standardese:
C ++ 11 4.12:零值,空指针值或空成员指针值转换为
false
; 任何其他值都将转换为true
。
答案 1 :(得分:3)
bool
可能在您的平台中使用一个字节,但其值表示只有一个1位,因为只有两个bool
类型的值:true
和{{1 }}。不是0,不是1,不是256。
这在C ++标准第3.9.1节第6段中提到:
false
类型的值可以是bool
或true
。 (...)
您可以将0和256分配给false
类型的变量,因为bool
和int
之间存在隐式转换。该转化将零转换为bool
,将其他任何内容转换为false
。这就是你在这里看到的。
这在4.12节中指定:
算术,无范围枚举,指针或指针的prvalue 成员类型可以转换为
true
类型的prvalue。零值, null指针值,或null成员指针值转换为bool
;任何其他值都将转换为false
。 (...)
true
未存储b = 256
。它正在存储256
。您无法将true
存储在256
变量中,因为bool
不是256
值。这是C ++ 而不是某种形式的汇编。 bool
并不意味着“将256的低8位写入变量b = 256
引用的存储单元”。如上面的标准引号所示,它表示“如果256为零,则将b
分配给变量false
;否则分配b
”。
在常见的实现中,值true
以二进制表示为00000000,但没有任何阻止它。实现可以根据需要自由选择不同的对象表示,因为这是无关紧要的:C ++代码在不破坏类型系统并且想知道实现定义的行为的情况下无法看到它。实现可以完全有效,并选择0xDEADBABE和0xDEADD00D作为false
和true
的对象表示:只有一位带有值表示。重要的是false
是一种用来表示简单真值的类型。它不是“我们可以测试的一堆比特”。
答案 2 :(得分:1)
转换为bool
0
以外的任何数值都会产生1
/ true
。
即使sizeof(bool) == 1
,它的语义也不同于char
的语义。
答案 3 :(得分:1)
因为C ++标准说的是(现在懒得挖出确切的引用)“将数值赋给bool变量,将零值转换为false,将任何其他值转换为true”。 / p>
答案 4 :(得分:0)
可能256没有直接分配,但检查是否为0.如果是,则布尔值为false(0),否则为真(!= 0)。
答案 5 :(得分:0)
这就是bool类型的工作方式,它可以是零或非零
答案 6 :(得分:0)
尝试
*reinterpret_cast<unsigned char *>(&b) = 256;
尽管如此,它是不安全的(sizeof(bool)
可以是1或4或其他任何东西,具体取决于实施情况。)
答案 7 :(得分:0)
bool是系统定义的类型,只能接受true / false或者1/0。它占用一个字节的事实是由于当前存储机制所施加的限制:在当前场景中不可能解决少于一个字节的数据。
使其易于理解:将bool视为具有重写赋值运算符的系统定义类型。运算符在内部将任何赋值转换为1/0,因此不会溢出。