Ответ 1
Он всегда один в C99, раздел 6.5.3.4:
При применении к операнду, который имеет тип char, без знака char или подписанный char, (или его квалифицированная версия) результат равен 1.
Изменить: не часть вашего вопроса, а интерес к Харбисону и Стил, 3-е изд. (pre c99) стр. 148:
Единицей хранения считается объем хранения, занимаемый одним персонаж; размер объекта type
char
, следовательно, 1.
Изменить: в ответ на ваш обновленный вопрос, следующий вопрос и ответ от Харбисона и Стил актуальны (там же, глава 4 главы 6):
Допустимо ли иметь C реализация, в которой тип
char
может представляют значения от -2,147,483,648 до 2,147,483,647? Если да, то что было быsizeof(char)
в рамках этой реализации? Что бы быть наименьшим и самым большим диапазоном типint
?
Ответ (ibid, стр. 382):
Разрешено (если расточительно) для для использования 32 бит для представляют тип
char
. Вне зависимости от реализации, значениеsizeof(char)
всегда 1.
В то время как это конкретно не касается случая, когда, скажем, байты составляют 8 бит, а char
- 4 из этих байтов (фактически невозможно с определением c99, см. ниже), тот факт, что sizeof(char) = 1
всегда ясно из c99 и Harbison и Steele.
Изменить: на самом деле (это ответ на ваш вопрос об обновлении 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**
- минимальное значение для объекта типа, подписанного char
**SCHAR_MIN -127//−(27−1)**
- максимальное значение для объекта типа, подписанного char
**SCHAR_MAX +127//27−1**
- максимальное значение для объекта типа unsigned char
**UCHAR_MAX 255//28−1**
- минимальное значение для объекта типа 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.