bool变量可以存储超过0x01吗?

时间:2013-06-27 03:38:06

标签: c++ binary boolean shift

#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。

所有编译器都有这种行为?

6 个答案:

答案 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(或true0的代码)。存储其他内容,您的程序行为无法预测。

1至少为8位,因为C ++内存模型不能很好地处理子字节对象(除了位字段)。你不应该使用那些其他7(或更多)位。

如果您想在对象中存储2个以上的值,请不要将其设为bool

答案 4 :(得分:1)

bool只能包含两个值:falsetrue

当/如果在整数上下文中使用时,bool可以转换为int。在这种情况下,false转换为0true转换为1

无论bool使用的存储空间大小(例如,sizeof(bool)==1sizeof(bool)==4都相当普遍),它仍然只能保存两个值falsetrue,始终分别转换为01。没有其他价值可能。

答案 5 :(得分:0)

为什么你甚至认为你可以? 这就像说int i = "abc";