Я хочу определить byte
введите в моей программе C ++, в основном unsigned char
Какой самый идиоматичный способ сделать это?
Я хочу определить byte
type, чтобы абстрагироваться от различных представлений и сделать возможным создание безопасных массивов этого нового byte
(8-битный) тип, который поддерживается unsigned char
для библиотеки манипуляций с битами, над которой я работаю для очень конкретного случая использования программы, которую я создаю. Я хочу, чтобы это было очень явный что это 8-битный байт, специфичный для домена моей программы, и это не зависит от различных реализаций, основанных на платформе или компиляторе.
char
, unsigned char
, или же signed char
все один байт; std::uint8_t
(от <cstdint>
) является 8-битным байтом (также существует подписанный вариант). Последний существует только в системах с 8-битными байтами. Существует также std::uint_least8_t
(из того же заголовка), который имеет по крайней мере 8 бит и std::uint_fast8_t
, который имеет не менее 8 битов и должен быть наиболее эффективным.
Самый идиоматический способ — это просто использовать signed char
или же unsigned char
, Вы можете использовать typedef, если хотите позвонить byte
или, если вам нужна строгая типизация, вы можете использовать BOOST_STRONG_TYPEDEF.
Если вам нужно ровно 8 бит, вы можете использовать uint8_t
от <cstdint>
но это не гарантировано, чтобы существовать на всех платформах.
Если честно, для меня это одна из самых раздражающих «функций» в C ++.
Да, вы можете использовать std::uint8_t
или же unsigned char
который в большинстве систем первым будет typedef
из последних.
Но … Это не тип безопасности, как typedef
не будет создавать новый тип. И комитет отказался добавить «сильный typedef» в стандарт.
рассматривать
void foo (std::uint8_t);
void foo (unsigned char); // ups...
В настоящее время я использую подход uint8_t. Я вижу это так: если у платформы нет 8-битного типа (в этом случае мой код не будет работать на этой платформе), то я не хочу, чтобы он работал в любом случае, потому что я получал бы неожиданное Поведение связано с тем, что я обрабатываю данные с предположением, что это 8 бит, тогда как на самом деле это не так. Поэтому я не понимаю, почему вы должны использовать unsigned char, предположить, что он равен 8 битам, а затем выполнить все ваши вычисления на основе этого предположения. Это просто напрашивается на неприятности, по моему мнению.