#include <iostream>
#include <bitset>
using namespace std;
int main()
{
bool a = 0x03;
bitset<8> x(a);
cout<<x<<endl;
a = a>>1;
bitset<8> y(a);
cout<<y<<endl;
}
结果是
00000001
00000000
结果是: 不:
00000011
00000001
如果我改变了类型 a
从 bool
到 char
意思是说,我不能在一个文件中存储超过0x01的数据。bool
所有大于0x01的右值都被视为0x01。
所有的编译器都有这样的行为?
§4.12 布尔运算转换 [conv.bool].
1 一个算术型、无范围枚举型、指针型或成员指针型的prvalue可以转换为bool型的prvalue。零值、空指针值或空成员指针值可转换为false。; 任何其他值都将转换为真。. 类型为std::nullptr_t的prvalue可以转换为类型为bool的prvalue,结果是false。
你唯一可以使用的值是 合理 寄存 bool
对象是 false
和 true
. 所有从其他类型转换为 bool
产生这两个值中的一个。A bool
对象的大小总是至少8位(除非它是一个位字段),但语言故意让它难以存储其他254个(或更多)可能值中的任何一个。
您 可以 玩花样 memcpy
或使用联合,或使用指针转换,来存储任何其他适合的值。但如果你这样做,它 可能 使你的程序行为未定义。这意味着编译器可以生成以下代码 假设 存储值是 false
或 true
(或 0
或 1
). 存储别的东西,你的程序的行为就不可预测了。
bool
是至少8位,因为C++的内存模型不能很好地处理子字节对象(除了位字段)。你不应该使用其他7位(或更多)。
如果你想在一个对象中存储2个以上的值,不要把它变成一个 bool
.
bool a = 0x03;
将 0x03 转换为布尔值。由于每一个非零的数值都会被评估为真,所以无论你要分配哪个数据,你都会看到第一个结果。
C++11, §3.9.16:
16: bool类型的值要么是true要么是false. [...]
A bool
只能容纳两个值。false
和 true
.
如果在整数语境中使用,a bool
可以转换为 int
. 在这种情况下: false
皈依 0
和 true
皈依 1
.
无论用于存储的规模如何,都是为了满足客户的需求。bool
(如:。sizeof(bool)==1
和 sizeof(bool)==4
都是相当常见的),它仍然只能容纳两个值。false
和 true
始终转换为 0
和 1
分别是。没有其他价值是可能的。
为什么你会认为你可以?这就像说 int i = "abc";
.