Может ли переменная bool хранить больше 0x01?

#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результат будет вторым.
Это означает, что я не могу хранить более 0x01 в boolвсе правильные значения больше 0x01 рассматриваются как 0x01.

Весь компилятор имеет свое поведение?

2

Решение

§4.12 Булевы преобразования [conv.bool]

1 Значение арифметики, перечисление с незаданной областью, указатель или указатель на тип элемента может быть преобразовано в значение типа bool. Нулевое значение, нулевое значение указателя или нулевое значение указателя члена преобразуется в ложное; любое другое значение преобразуется в истинное. Значение типа std :: nullptr_t может быть преобразовано в значение типа bool; результирующее значение ложно.

7

Другие решения

bool a = 0x03; преобразует 0x03 в логическое значение. Поскольку каждое числовое значение, отличное от нуля, будет оценено как истинное, вы увидите первый результат, независимо от того, какие данные вы назначите.

4

C ++ 11, §3.9.1 / 6:

Значения типа bool являются либо истиной, либо ложью. […]

2

Единственные ценности, которые вы можете законно хранить в bool объект false а также true, Все преобразования из других типов в bool дать одно из этих двух значений. bool Объект всегда имеет размер не менее 8 бит (если это не битовое поле), но язык намеренно затрудняет сохранение любых других 254 (или более) возможных значений.

Вы Можно играть трюки, как с помощью memcpyили с помощью объединения или с помощью преобразования указателей, чтобы сохранить любое другое значение, которое будет соответствовать. Но если вы это сделаете, это наверное делает поведение вашей программы неопределенным. Это означает, что компилятору разрешено генерировать код, который предполагает сохраненное значение либо false или же true (или же 0 или же 1). Сохраните что-нибудь еще, и поведение вашей программы непредсказуемо.

bool по крайней мере 8 бит, потому что модель памяти C ++ плохо работает с суббайтовыми объектами (кроме битовых полей). Вы не должны использовать эти другие 7 (или более) бит.

Если вы хотите сохранить более двух значений в объекте, не делайте его bool,

2

bool может содержать только два значения: false а также true,

Когда / если используется в целочисленном контексте, bool может быть преобразован в int, В этом случае, false превращается в 0 а также true превращается в 1,

Независимо от размера хранилища, используемого для bool (например., sizeof(bool)==1 а также sizeof(bool)==4 оба довольно распространены) он все еще может содержать только два значения false а также true, которые всегда конвертируются в 0 а также 1 соответственно. Никакое другое значение невозможно.

1

Почему ты вообще думаешь, что можешь?
Это как сказать int i = "abc";,

0
По вопросам рекламы [email protected]