Тип, используемый для представления байта в ANSI (C89 / 90) C? - PullRequest
33 голосов
/ 13 января 2009

Существует ли стандартный метод подачи жалоб для представления байта в ANSI (C89 / 90) C? Я знаю, что чаще всего символ является байтом, но я понимаю, что это не гарантируется. Кроме того, в стандарте C99 есть stdint.h, но что использовалось до C99?

Мне интересно как 8 бит, так и "байт" (sizeof (x) == 1).

Ответы [ 6 ]

63 голосов
/ 13 января 2009

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

Акцент мой.

9 голосов
/ 13 января 2009

Вы всегда можете представить байт (если вы имеете в виду 8 бит) в неподписанном символе. Он всегда имеет размер не менее 8 бит, все биты составляют значение, поэтому 8-битное значение всегда будет соответствовать ему.

Если вы хотите ровно 8 бит, я также думаю, что вам придется использовать платформо-зависимые способы. Для систем POSIX требуется для поддержки int8_t. Это означает, что в системах POSIX символ (и, следовательно, байт) всегда равен 8 битам.

3 голосов
/ 13 января 2009

В 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 » * 1008

1 голос
/ 13 января 2009

до C99? Платформо-зависимый код.

Но почему тебя это волнует? Просто используйте stdint.h.

В каждой реализации C, которую я использовал (от старой UNIX до встроенных компиляторов, написанных аппаратными инженерами для компиляторов крупных поставщиков) char всегда был 8-разрядным.

0 голосов
/ 12 июня 2011

Я заметил, что некоторые из ответивших переопределили слово байт, чтобы обозначать что-то отличное от 8 бит. Байт равен 8 битам, однако в некоторых реализациях c символ представляет собой 16 бит (2 байта) или 8 бит (1 байт). Люди, которые называют байт «наименьшей адресуемой единицей памяти» или что-то в этом роде, потеряли понимание значения байта (8 бит). Причина того, что некоторые реализации C имеют 16-битные символы (2 байта), а некоторые имеют 8-битные символы (1 байт), и нет стандартного типа с именем 'byte', вызвана ленью.

Итак, мы должны использовать int_8

0 голосов
/ 13 января 2009

Вы можете найти довольно надежные макросы и определения типов в boost

...