Тип, используемый для представления байта в 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 Размер оператора

  1. ...
  2. Оператор size of возвращает размер (в байтах) своего операнда, который может быть выражением или именем типа в скобках. [...]
  3. Применительно к операнду, который имеет тип 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

Другие вопросы по тегам