Тип для представления байта в ANSI (C89/90) C?

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

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

Ответы

Ответ 1

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 Оператор sizeof

  • ...
  • Оператор sizeof дает размер (в байтах) своего операнда, который может быть выражением или именем в скобках типа. [...]
  • При применении к операнду, который имеет тип char, unsigned char или signed char (или его квалифицированная версия), результат 1. [...]

Акцент на мой.

Ответ 2

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

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

Ответ 3

В ANSI C89/ISO C90 sizeof (char) == 1. Однако не всегда бывает, что 1 байт составляет 8 бит. Если вы хотите подсчитать количество бит в 1 байт (и у вас нет доступа к ограничениям .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);
}

Здесь мы используем метод Kernighan для подсчета количества бит, установленных в c. Чтобы лучше понять вышеприведенный код (или увидеть других подобных), я отсылаю вас к " Бит Twiddling Hacks".

Ответ 4

До C99? Код, зависящий от платформы.

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

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

Ответ 5

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

Ответ 6

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

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