char
всегда байт , но это не всегда октет . Байт является самой маленькой адресуемой единицей памяти (в большинстве определений), октет является 8-разрядной единицей памяти.
таким образом, sizeof(char)
всегда 1 для всех реализаций, но CHAR_BIT
макрос в limits.h
определяет размер байта для платформы, и это - не всегда 8 битов. Существуют платформы с 16-разрядными и 32-разрядными байтами, следовательно char
поднимет больше битов, но это - все еще байт. Так как требуемый диапазон для char
является по крайней мере-127 к 127 (или от 0 до 255), это будет [по крайней мере 1 110] 8 обдумали все платформы.
ISO/IEC 9899:TC3
6.5.3.4 sizeof оператор
- ...
- sizeof оператор приводит к размеру ( в байтах ) его операнда, который может быть выражением или заключенным в скобки названием типа. [...]
- , Когда относится операнд, который имеет тип
char
,unsigned char
, илиsigned char
, (или qualiп¬Ѓed версия этого) результат, 1 . [...]
шахта Emphasis.
Можно всегда представлять байт (если Вы имеете в виду 8 битов) в неподписанном символе. Это всегда - по крайней мере 8 битов в размере, все биты, составляющие значение, таким образом, 8 битовых значений будут всегда вписываться в него.
, Если Вы хотите точно 8 битов, я также думаю, что необходимо будет использовать зависимого платформы пути. Системы POSIX, кажется, , потребовал поддерживать int8_t. Это означает, что в системах POSIX, символ (и таким образом байт) всегда - 8 битов.
В ANSI C89/ISO C90 sizeof (символ) == 1. Однако не всегда имеет место, что 1 байт составляет 8 битов. Если Вы хотите считать число битов в 1 байте (и у Вас нет доступа к limits.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. Чтобы лучше понять код выше (или видеть других как он), я отсылаю Вас к" Взломы Битового жонглирования ".
Перед C99? Зависимый от платформы код.
, Но почему Вы заботитесь? Просто используйте stdint.h.
В каждой реализации C я использовал (от старого UNIX до встроенных компиляторов, записанных инженерами аппаратного обеспечения в компиляторы большого поставщика) char
, всегда было 8-разрядным.
Можно найти довольно надежные макросы и определения типов в повышении.