Есть ли в стандартном С++ тип bool с фиксированной шириной?

Насколько мне удалось обнаружить, ширина типа bool определяется реализацией. Но существуют ли логические типы фиксированной ширины, или я должен придерживаться, например, uint8_t для представления логического значения фиксированной ширины?

[EDIT] Я сделал этот скрипт Python, который автоматически генерирует класс C++, который может содержать переменные, которые я хочу иметь возможность отправлять между микроконтроллером и моим компьютером. Это работает так: он также хранит два массива, содержащие указатель на каждую из этих переменных и размер каждой из них. Это дает мне необходимую информацию для простой сериализации и десериализации каждой из этих переменных. Однако, чтобы это работало, sizeof, endianness и т. д. типов переменных должны быть одинаковыми с обеих сторон, поскольку я использую один и тот же сгенерированный код с обеих сторон. Я не знаю, будет ли это проблемой, но я не ожидаю, что это будет. Я уже работал с этим (32-битным ARM) чипом раньше, и в прошлом у меня не было проблем с отправкой целых чисел и типов с плавающей запятой. Однако пройдет несколько дней, прежде чем я вернусь и смогу опробовать булевы значения на чипе. Это может стать более серьезной проблемой позже, поскольку этот код может быть повторно использован на других чипах позже.

Итак, мой вопрос. Существует ли тип фиксированной ширины bool, определенный в стандартных библиотеках, или я должен просто использовать uint8_t для представления логического значения?


person Aaron de Windt    schedule 25.12.2015    source источник
comment
Тип bool фиксируется на true и false. Как 2 состояния могут иметь разную ширину?   -  person Thomas Matthews    schedule 25.12.2015
comment
Вы говорите об упаковке одного или нескольких bool в интегральный тип?   -  person Thomas Matthews    schedule 25.12.2015
comment
Вы имеете в виду размер в памяти? Если это так, это зависит от компилятора для bool. В 99,9% он занимает 1 бит, так как представляет собой истину или ложь, включено или выключено. Однако остальные 7 забиты, их нельзя использовать. Это ответило на это для вас?   -  person Emz    schedule 25.12.2015
comment
Вы говорите о 8-битных, 16-битных, 32-битных и 64-битных целых числах для представления одного bool?   -  person Thomas Matthews    schedule 25.12.2015
comment
@Emz, как ты пришел к такому выводу на 99,9%?   -  person M.M    schedule 25.12.2015
comment
В настоящее время я пишу код, который взаимодействует между микрокронтроллером и компьютером. Мне просто интересно, даст ли sizeof(bool) одинаковый результат на обоих. Видимо не надо.   -  person Aaron de Windt    schedule 25.12.2015
comment
Зависит от минимально доступного размера микроконтроллера. Если микроконтроллер может работать только с 16-битными величинами или больше, то размер bool будет 16-битным. Некоторые микроконтроллеры могут обращаться к биту как к минимальному размеру.   -  person Thomas Matthews    schedule 25.12.2015
comment
@M.M Я придумал это, основываясь на своем собственном опыте (100%), затем я вычел 0,1%, прежде чем Джон Скит или какой-то другой монстр придет и поправит меня. Я всегда мог утверждать, что принял это во внимание! (Я SMRT!) Шутки в сторону: это число составлено и означает, что оно чаще всего хранится как 1 байт, где используется только 1 бит. Ссылка Отказ от ответственности: я не утверждаю, что Джон Скит настоящий монстр.   -  person Emz    schedule 25.12.2015
comment
Существует только один тип данных, явно предназначенный для логических значений, и у него нет нужного вам свойства. Простой ответ: выберите тип с фиксированной шириной и используйте его как логическое значение.   -  person tenfour    schedule 25.12.2015
comment
@Emz: обычно bool составляет 8 бит, при этом все, кроме младшего бита, имеют значение 0.   -  person Keith Thompson    schedule 25.12.2015
comment
Было бы полезно, если бы вы могли объяснить, почему вам нужен логический тип определенной ширины. Какой цели может служить такой тип, которого еще нет в bool? (Наличие фиксированной ширины не является ответом.)   -  person Keith Thompson    schedule 25.12.2015
comment
@KeithThompson Это то, что я сказал? Кроме нулевой инициализации остальных битов, потому что это не гарантируется. Тогда мне пришлось бы добавить еще один случай 99,9%.   -  person Emz    schedule 25.12.2015
comment
Если вы используете другой тип для имитации логического значения, имейте в виду, что вам нужно будет вручную производить логические преобразования, например. x & FLAG должен стать !!(x & FLAG)   -  person M.M    schedule 25.12.2015
comment
Размер любых типов в C и C++ не обязательно одинаков для разных архитектур.   -  person phuclv    schedule 25.12.2015
comment
@LưuVĩnhPhúc, кроме char и друзей, это всегда 1 байт. Если вам нужно одинаковое количество бит, это uint32_t и его друзья.   -  person n. 1.8e9-where's-my-share m.    schedule 25.12.2015
comment
@KeithThompson Я сделал этот скрипт Python, который автоматически генерирует класс C ++, который может содержать переменные, которые я хочу иметь возможность отправлять между микроконтроллером и компьютером. Это работает так, что я также храню два массива, содержащих указатель на каждую из этих переменных и размер каждой из них. Это дает мне необходимую информацию для простой сериализации и десериализации каждой из этих переменных. Однако, чтобы это работало, sizeof, endianness и т. д. типов переменных должны быть одинаковыми с обеих сторон.   -  person Aaron de Windt    schedule 25.12.2015
comment
Эта информация должна быть в вопросе, а не только в комментарии. С этим дополнительным фоном я не думаю, что это дубликат. Вы спрашиваете, как передать логические значения из одной системы в другую, где две системы могут не использовать одно и то же представление.   -  person Keith Thompson    schedule 25.12.2015
comment
@KeithThompson Как вы рекомендовали, я добавил справочную информацию к вопросу.   -  person Aaron de Windt    schedule 26.12.2015


Ответы (1)


Нет. Просто используйте uint8_t, если вам нужно быть уверенным в размере. Любой целочисленный тип можно легко рассматривать как логический в языках, связанных с C. См. https://stackoverflow.com/a/4897859/1105015 для подробного обсуждения того, как размер bool не гарантируется стандартом может быть любое конкретное значение.

person Rob Starling    schedule 26.12.2015
comment
конечно, при этом не происходит неявного преобразования в bool, поэтому вам нужно быть осторожным. Например, uint8_t x = 0x500 & 0x100; будет 0, а логическое значение будет true. - person M.M; 26.12.2015
comment
@M.M правда, но это легко исправить: uint8_t x = 0x500 & 0x100 != 0. Вам просто нужно быть осторожным. - person Mark Ransom; 27.12.2015
comment
@MarkRansom ITYM (0x500 & 0x100) != 0 ;) - person M.M; 27.12.2015