#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.
Весь компилятор имеет свое поведение?
§4.12 Булевы преобразования [conv.bool]
1 Значение арифметики, перечисление с незаданной областью, указатель или указатель на тип элемента может быть преобразовано в значение типа bool. Нулевое значение, нулевое значение указателя или нулевое значение указателя члена преобразуется в ложное; любое другое значение преобразуется в истинное. Значение типа std :: nullptr_t может быть преобразовано в значение типа bool; результирующее значение ложно.
bool a = 0x03;
преобразует 0x03 в логическое значение. Поскольку каждое числовое значение, отличное от нуля, будет оценено как истинное, вы увидите первый результат, независимо от того, какие данные вы назначите.
C ++ 11, §3.9.1 / 6:
Значения типа bool являются либо истиной, либо ложью. […]
Единственные ценности, которые вы можете законно хранить в bool
объект false
а также true
, Все преобразования из других типов в bool
дать одно из этих двух значений. bool
Объект всегда имеет размер не менее 8 бит (если это не битовое поле), но язык намеренно затрудняет сохранение любых других 254 (или более) возможных значений.
Вы Можно играть трюки, как с помощью memcpy
или с помощью объединения или с помощью преобразования указателей, чтобы сохранить любое другое значение, которое будет соответствовать. Но если вы это сделаете, это наверное делает поведение вашей программы неопределенным. Это означает, что компилятору разрешено генерировать код, который предполагает сохраненное значение либо false
или же true
(или же 0
или же 1
). Сохраните что-нибудь еще, и поведение вашей программы непредсказуемо.
bool
по крайней мере 8 бит, потому что модель памяти C ++ плохо работает с суббайтовыми объектами (кроме битовых полей). Вы не должны использовать эти другие 7 (или более) бит.
Если вы хотите сохранить более двух значений в объекте, не делайте его bool
,
bool
может содержать только два значения: false
а также true
,
Когда / если используется в целочисленном контексте, bool
может быть преобразован в int
, В этом случае, false
превращается в 0
а также true
превращается в 1
,
Независимо от размера хранилища, используемого для bool
(например., sizeof(bool)==1
а также sizeof(bool)==4
оба довольно распространены) он все еще может содержать только два значения false
а также true
, которые всегда конвертируются в 0
а также 1
соответственно. Никакое другое значение невозможно.
Почему ты вообще думаешь, что можешь?
Это как сказать int i = "abc";
,