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

如果我将 from 的类型更改为ato boolchar结果将是第二个。这意味着我不能在 a 中存储超过 0x01 bool,所有大于 0x01 的值都被视为 0x01。

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

4

6 回答 6

8

§4.12 布尔转换 [conv.bool]

1 算术、无范围枚举、指针或指向成员类型的指针的纯右值可以转换为 bool 类型的纯右值。零值、空指针值或空成员指针值转换为 false任何其他值都转换为 true。std::nullptr_t 类型的纯右值可以转换为 bool 类型的纯右值;结果值为假。

于 2013-06-27T03:44:30.113 回答
5

您可以合法存储在bool对象中的唯一值是falsetrue。从其他类型进行的所有转换都会bool产生这两个值之一。对象的bool大小始终至少为 8 位(除非它是位域),但该语言故意使存储其他 254 个(或更多)可能值变得困难。

可以玩一些技巧,例如使用memcpy,或使用联合,或使用指针转换,以存储任何其他适合的值。但是如果你这样做,它可能会使你的程序的行为未定义。这意味着允许编译器生成假定存储值是falseor true(or 0or 1) 的代码。存储其他东西,你的程序的行为是不可预测的。

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

如果您想在一个对象中存储超过 2 个值,请不要将其设为bool.

于 2013-06-27T04:09:46.417 回答
4

bool a = 0x03;将 0x03 转换为布尔值。由于每个非零数值都将被评估为真,因此无论您分配哪些数据,您都会看到第一个结果。

于 2013-06-27T03:41:37.520 回答
2

C++11,§3.9.1/6:

bool 类型的值为真或假。[...]

于 2013-06-27T03:43:45.623 回答
1

Abool只能保存两个值:falsetrue

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

不管 a 使用的存储大小如何bool(例如,sizeof(bool)==1两者sizeof(bool)==4都相当常见),它仍然只能保存两个值falseand true,它们总是分别转换为0and 1。没有其他值是可能的。

于 2013-06-27T03:58:57.083 回答
0

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

于 2013-06-27T03:41:22.100 回答