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

问题描述 投票:3回答:6
#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

如果我改变了类型 aboolchar意思是说,我不能在一个文件中存储超过0x01的数据。bool所有大于0x01的右值都被视为0x01。

所有的编译器都有这样的行为?

c++ binary boolean shift
6个回答
8
投票

§4.12 布尔运算转换 [conv.bool].

1 一个算术型、无范围枚举型、指针型或成员指针型的prvalue可以转换为bool型的prvalue。零值、空指针值或空成员指针值可转换为false。; 任何其他值都将转换为真。. 类型为std::nullptr_t的prvalue可以转换为类型为bool的prvalue,结果是false。


5
投票

你唯一可以使用的值是 合理 寄存 bool 对象是 falsetrue. 所有从其他类型转换为 bool 产生这两个值中的一个。A bool 对象的大小总是至少8位(除非它是一个位字段),但语言故意让它难以存储其他254个(或更多)可能值中的任何一个。

可以 玩花样 memcpy或使用联合,或使用指针转换,来存储任何其他适合的值。但如果你这样做,它 可能 使你的程序行为未定义。这意味着编译器可以生成以下代码 假设 存储值是 falsetrue (或 01). 存储别的东西,你的程序的行为就不可预测了。

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

如果你想在一个对象中存储2个以上的值,不要把它变成一个 bool.


4
投票

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


2
投票

C++11, §3.9.16:

16: bool类型的值要么是true要么是false. [...]


1
投票

A bool 只能容纳两个值。falsetrue.

如果在整数语境中使用,a bool 可以转换为 int. 在这种情况下: false 皈依 0true 皈依 1.

无论用于存储的规模如何,都是为了满足客户的需求。bool (如:。sizeof(bool)==1sizeof(bool)==4 都是相当常见的),它仍然只能容纳两个值。falsetrue始终转换为 01 分别是。没有其他价值是可能的。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.