#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
,则结果将是第二个。{
这意味着我不能在bool
中存储超过0x01,大于0x01的所有正确值都被视为0x01。
所有编译器都有这种行为?
答案 0 :(得分:7)
§4.12布尔转换[conv.bool]
1算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为bool类型的prvalue。 零值,空指针值或空成员指针值转换为false ; 任何其他值都会转换为true 。类型为std :: nullptr_t的prvalue可以转换为bool类型的prvalue;结果值为false。
答案 1 :(得分:4)
bool a = 0x03;
将0x03转换为布尔值。由于每个非零的数值都将被评估为真,因此无论您分配哪个数据,都会看到第一个结果。
答案 2 :(得分:2)
C ++ 11,§3.9.1/ 6:
bool类型的值为true或false。 [...]
答案 3 :(得分:2)
bool
false
true
对象中
bool
的所有转换都会产生这两个值中的一个。 bool
对象的大小始终至少为8位(除非它是位字段),但语言故意难以存储任何其他254个(或更多)可能的值。
你可以玩弄技巧,比如使用memcpy
,或使用联合,或使用指针转换,来存储任何适合的其他值。但是如果你这样做,可能会使你的程序行为不明确。这意味着允许编译器生成假设存储值为<{1}}或false
(或true
或0
的代码)。存储其他内容,您的程序行为无法预测。
1
至少为8位,因为C ++内存模型不能很好地处理子字节对象(除了位字段)。你不应该使用那些其他7(或更多)位。
如果您想在对象中存储2个以上的值,请不要将其设为bool
。
答案 4 :(得分:1)
bool
只能包含两个值:false
和true
。
当/如果在整数上下文中使用时,bool
可以转换为int
。在这种情况下,false
转换为0
,true
转换为1
。
无论bool
使用的存储空间大小(例如,sizeof(bool)==1
和sizeof(bool)==4
都相当普遍),它仍然只能保存两个值false
和true
,始终分别转换为0
和1
。没有其他价值可能。
答案 5 :(得分:0)
为什么你甚至认为你可以?
这就像说int i = "abc";
。