Почему объекты типов bool и _Bool в C и bool в C ++ могут хранить только значения 0 или 1, если они занимают 1 байт в памяти, которая может содержать 256 значений?
Если bool
может хранить весь диапазон значений char
, то почему бы просто не использовать char
?
Конечно, их целью является представление только значения 0 и 1 или true и false, но какой модуль или макрос решает, что он может хранить только 0 или 1?
Компилятор будет обрабатывать преобразование, когда вы присваиваете значение bool переменная. Если это правда, то переменная будет содержать true
. Такое поведение было определено в стандартах C и C ++. Это означает, что bool a; a = 25;
полностью действителен, а не "неуместное назначение" , как вы. После этого a
всегда будет содержать true / 1. Вы никогда не сможете установить bool на что-либо кроме 0 и 1 с помощью обычного присваивания переменной
Нет проблем с использованием char или int в качестве bool, как это было до современных C и C ++, но путем ограничения Диапазон значений также позволяет компилятору выполнять множество оптимизаций. Например, bool x = !y;
будет выполнено с помощью простой инструкции XOR, которая не будет работать, если y содержит какие-либо значения, отличные от 0 и 1. Если y является нормальным целочисленным типом, вам нужно сначала нормализовать y до 0 и 1. См. demo
На самом деле, не все биты в представлении должны участвовать в вычислении значения, и не все битовые комбинации должны быть действительными. C и C ++ позволяют типам содержать биты заполнения и представления прерываний , поэтому 32-битный тип может иметь только 30 битов значения или может хранить только 2 32 -4 разные значения. Это не означает, что bool определенно содержит биты заполнения, просто доказательство того, что вам разрешено иметь тип, более узкий, чем возможный диапазон
Единственное исключение, о котором мы знаем, это _Bool
(как наблюдается Джозефом Майерсом в отношении G CC). Кажется, что можно (а) принять не {0,1} значения, чтобы быть представлениями ловушек в текущем смысле, или (b) рассматривать операции с не {0,1} значениями этого типа как выдачу неопределенного значения. Последнее связывало бы возможное неправильное поведение, которое было бы хорошо для программистов; единственный возможный недостаток, о котором мы знаем, это то, что он может ограничить компиляцию с помощью вычисляемых таблиц ветвлений, проиндексированных по непроверенным значениям _Bool
.
N2091: уточнение представлений ловушек (предварительный отчет о дефектах или предложение для C2x)
Однако некоторые реализации считают их представлениями ловушек
Фактически, как реализовано в G CC и Clang, тип _Bool имеет два значения и ловушку 254 представления.
Представления ловушек и биты заполнения - Pascal Cuoq
И что произойдет, если значение логического типа случайно изменяется в памяти на большее значение?
Если вы манипулируете значением bool для другого значения напрямую через указатель, то в C ++ неопределенное поведение произойдет
6.9.1 Фундаментальные типы
Значения типа bool либо true, либо false. 50 [ Примечание: Нет типов или значений типа подпись, без знака, коротких или длинных значений. - конец примечания ] Значения типа bool участвуют в интегральных повышениях (7.6).
50) Использование значения bool способами, описанными в этом международном стандарте как «неопределенные» », Например, путем проверки значения неинициализированного автоматического объекта c, он может вести себя так, как если бы он не был ни истинным, ни ложным.
C ++ 17
Не удалось найти ссылку в C99 , но поведение будет неопределенным, если заданное вами значение будет представлением прерывания
6.2.6 Представления типы
Определенные представления объектов не обязательно должны представлять значение типа объекта. Если сохраненное значение объекта имеет такое представление и читается выражением lvalue, которое не имеет символьного типа, поведение не определено. Если такое представление создается побочным эффектом, который изменяет весь или любую часть объекта выражением lvalue, которое не имеет символьного типа, поведение не определено. 41) Такое представление называется представление ловушек .
Уже есть много вопросов относительно этого "странного" поведения