Это всегда один в C99, раздел 6.5.3.4:
При применении к операнду, имеющему тип char, unsigned char или signed char (или их квалифицированную версию), результат равен 1.
Изменить: не часть вашего вопроса, но для интереса Харбисона и Стила, 3-е изд. (pre c99) стр. 148:
Под единицей хранения понимается объем памяти, занимаемый одним символом; char
поэтому размер объекта типа равен 1.
Изменить: в ответ на ваш обновленный вопрос актуален следующий вопрос и ответ от Харбисона и Стила (там же, пример 4 из главы 6):
Допустимо ли иметь реализацию C, в которой тип char
может представлять значения в диапазоне от -2 147 483 648 до 2 147 483 647? Если да, то что будет sizeof(char)
под этой реализацией? Какой будет самый маленький и самый большой набор шрифтов int
?
Ответ (там же, с. 382):
Для реализации разрешено (если это расточительно) использовать 32 бита для представления типа char
. Независимо от реализации значение
sizeof(char)
всегда равно 1.
Хотя это специально не касается случая, когда, скажем, байты равны 8 битам и char
составляют 4 из этих байтов (что на самом деле невозможно с определением c99, см. Ниже), этот факт sizeof(char) = 1
всегда ясен из стандарта c99 и Харбисона и Стила.
Edit: На самом деле (это в ответ на ваш вопрос UPD 2), насколько c99 обеспокоен sizeof(char)
является в байтах, снова из раздела 6.5.3.4:
Оператор sizeof возвращает размер (в байтах) его операнда.
поэтому в сочетании с приведенной выше цитатой, байты из 8 бит и char
4 из этих байтов невозможны: для c99 байт совпадает сchar
.
В ответ на ваше упоминание о возможности 7-битного char
: это невозможно в c99. Согласно разделу 5.2.4.2.1 стандарта минимум 8:
Их значения, определяемые реализацией, должны быть равны или больше [выделено мной] по величине показанных с тем же знаком.
- количество бит для наименьшего объекта, не являющегося битовым полем (байт)
**CHAR_BIT 8**
- минимальное значение для объекта типа signed char
**SCHAR_MIN -127
- максимальное значение для объекта типа signed char
**SCHAR_MAX +127
- максимальное значение для объекта типа unsigned char
**UCHAR_MAX 255
- минимальное значение для объекта типа char
**CHAR_MIN** see below
- максимальное значение для объекта типа char
**CHAR_MAX** see below
[...]
Если значение объекта типа char обрабатывается как целое число со знаком при использовании в выражении, значение CHAR_MIN должно быть таким же, как и значение SCHAR_MIN, а значение CHAR_MAX должно быть таким же, как и значение SCHAR_MAX. В противном случае значение CHAR_MIN должно быть 0, а значение CHAR_MAX должно быть таким же, как и значение UCHAR_MAX. Значение UCHAR_MAX должно равняться 2 ^ CHAR_BIT - 1.