Тип для представления байта в 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