Тип, используемый для представления байта в ANSI (C89 / 90) C?
Вопрос
Существует ли метод жалобы о соответствии стандартам для представления байта в ANSI (C89 / 90) C? Я знаю, что чаще всего символ является байтом, но я понимаю, что это не гарантируется. Кроме того, в стандарте C99 есть stdint.h, но что использовалось до C99?
Мне интересно как конкретно 8 бит, так и "байт" (sizeof (x) == 1).
Решение
char
всегда является байтом , но это не всегда октет . Байт - это наименьшая адресуемая единица памяти (в большинстве определений), октет - это 8-битная единица памяти.
То есть sizeof (char)
всегда 1 для всех реализаций, но макрос CHAR_BIT
в limit.h
определяет размер байта для платформы, и он не всегда 8 бит. Существуют платформы с 16-битными и 32-битными байтами, поэтому char
будет занимать больше битов, но это все еще байт. Поскольку требуемый диапазон для char
составляет по крайней мере от -127 до 127 (или от 0 до 255), он будет как минимум 8 бит на всех платформах.
ISO / IEC 9899: TC3
6.5.3.4 Оператор sizeof
<Ол>... Оператор sizeof возвращает размер ( в байтах ) своего операнда, который может быть выражением или именем типа в скобках. [...] При применении к операнду с типом Ол>char
,unsigned char
илиsignature char
, (или квалифицированной версией & # 64257; ed) из этого) результат 1 . [...]
Акцент мой.
Другие советы
Вы всегда можете представить байт (если вы имеете в виду 8 бит) в неподписанном символе. Он всегда имеет размер не менее 8 бит, все биты составляют значение, поэтому 8-битное значение всегда будет соответствовать ему. Р>
Если вы хотите ровно 8 бит, я также думаю, что вам придется использовать зависящие от платформы способы. Похоже, что системы POSIX необходимы для поддержки int8_t. Это означает, что в системах POSIX символ (и, следовательно, байт) всегда равен 8 битам. Р>
В ANSI C89 / ISO C90 sizeof (char) == 1. Однако не всегда так, что 1 байт равен 8 битам. Если вы хотите посчитать количество бит в 1 байте (и у вас нет доступа к limit.h), я предлагаю следующее:
unsigned int bitnum(void) {
unsigned char c = ~0u; /* Thank you Jonathan. */
unsigned int v;
for(v = 0u; c; ++v)
c &= c - 1u;
return(v);
}
Здесь мы используем метод Кернигана для подсчета количества битов, установленных в c . Чтобы лучше понять приведенный выше код (или увидеть другие подобные), я отсылаю вас к " Битовые хаки ".
До C99? Платформо-зависимый код.
Но почему тебя это волнует? Просто используйте stdint.h.
В каждой реализации C, которую я использовал (от старой UNIX до встроенных компиляторов, написанных аппаратными инженерами для компиляторов крупных поставщиков), char
всегда был 8-разрядным.
Вы можете найти довольно надежные макросы и определения типов в boost. Р>
Я заметил, что некоторые из ответивших переопределили слово байт, чтобы обозначать что-то отличное от 8 бит. Байт равен 8 битам, однако в некоторых реализациях c символ представляет собой 16 бит (2 байта) или 8 бит (1 байт). Люди, которые называют байт «наименьшей адресуемой единицей памяти» или что-то в этом роде, потеряли понимание значения байта (8 бит). Причина того, что некоторые реализации C имеют 16-битные символы (2 байта), а некоторые имеют 8-битные символы (1 байт), и нет стандартного типа с именем 'byte', вызвана ленью.
Итак, мы должны использовать int_8