【问题标题】:Can a bool variable store more than 0x01?布尔变量可以存储超过 0x01 吗?
【发布时间】:2013-06-27 03:38:05
【问题描述】:
#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。

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

【问题讨论】:

  • 试试bool a = 2;。同样的事情也会发生。

标签: c++ binary boolean shift


【解决方案1】:

§4.12 布尔转换 [conv.bool]

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        C++11,§3.9.1/6:

        bool 类型的值要么是真要么是假。 [...]

        【讨论】:

          【解决方案5】:

          bool 只能包含两个值:falsetrue

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

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

            • 一个 bool 有 1 字节的内存大小,所以我想我可以给它分配一个 1 字节的值。 "abc" 是一个 char 数组,将 "abc" 放入 int 是没有意义的。
            • @user2261693 编译器总是先将您的表达式转换为布尔值,然后再存储到内存中。如果您真的想在该字节中存储其他内容,您可以使用reinterpret_cast&lt;char&amp;&gt;(a) = 3,但请注意这是未定义的行为,编译器可以将其优化为您不期望的内容。
            猜你喜欢
            • 1970-01-01
            • 2017-09-28
            • 2011-02-04
            • 2010-10-10
            • 2022-11-14
            • 1970-01-01
            • 2014-04-26
            • 2022-01-08
            相关资源
            最近更新 更多