Тип, используемый для представления байта в ANSI (C89/90) C?
Существует ли метод подачи жалоб по стандартам для представления байта в ANSI (C89/90) C? Я знаю, что чаще всего символ является байтом, но я понимаю, что это не обязательно так. Кроме того, в стандарте C99 есть stdint.h, но что использовалось до C99?
Мне интересно как 8 бит, так и "байт" (sizeof(x) == 1).
6 ответов
char
всегда байт, но не всегда октет. Байт - это наименьшая адресуемая единица памяти (в большинстве определений), октет - это 8-битная единица памяти.
То есть, sizeof(char)
всегда 1 для всех реализаций, но CHAR_BIT
макрос в limits.h
определяет размер байта для платформы, и он не всегда 8 бит. Есть платформы с 16-битными и 32-битными байтами, следовательно char
займет больше битов, но это все еще байт. Так как необходимый диапазон для char
по крайней мере от -127 до 127 (или от 0 до 255), это будет как минимум 8 бит на всех платформах.
ISO / IEC 9899: TC3
6.5.3.4 Размер оператора
- ...
- Оператор size of возвращает размер (в байтах) своего операнда, который может быть выражением или именем типа в скобках. [...]
- Применительно к операнду, который имеет тип
char
,unsigned char
, или жеsigned char
(или его квалифицированная версия) результат равен 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. Чтобы лучше понять приведенный выше код (или увидеть другие подобные), я отсылаю вас к " Bit Twiddling Hacks".
До C99? Платформо-зависимый код.
Но почему тебя это волнует? Просто используйте stdint.h.
В каждой реализации C I использовались (от старой UNIX до встроенных компиляторов, написанных аппаратными инженерами для компиляторов крупных поставщиков) char
всегда был 8-битным.
Вы можете найти довольно надежные макросы и typedefs в boost.
Я заметил, что некоторые из них переопределили слово байт, чтобы обозначать что-то, кроме 8 бит. Байт равен 8 битам, однако в некоторых реализациях c символ представляет собой 16 бит (2 байта) или 8 бит (1 байт). Люди, которые называют байт "наименьшей адресуемой единицей памяти" или что-то в этом роде, потеряли понимание значения байта (8 бит). Причина того, что некоторые реализации C имеют 16-битные символы (2 байта), а некоторые имеют 8-битные символы (1 байт), а стандартного типа с именем 'byte' нет, заключается в лени.
Итак, мы должны использовать int_8