Це завжди одне в C99, розділ 6.5.3.4:
При застосуванні до операнда, який має тип char, unsigned char або подписаний char (або його кваліфіковану версію), результат дорівнює 1.
Редагувати: не частина вашого запитання, але для зацікавлення від Harbison and Steele, 3rd edition. (до 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 та Harbison and Steele.
Edit: Насправді (це у відповідь на ваше запитання UPD 2), наскільки c99 стурбований sizeof(char)
знаходиться в байтах, з розділу 6.5.3.4 знову:
Оператор sizeof видає розмір (у байтах) його операнда
отже, у поєднанні з цитатою вище, байти по 8 бітів і char
як 4 з цих байт неможливі: для c99 байт - це те саме, що a char
.
У відповідь на вашу згадку про можливість 7-бітного char
: це неможливо в c99. Відповідно до розділу 5.2.4.2.1 стандарту мінімум становить 8:
Їх значення, визначені реалізацією, мають бути рівними або більшими [мій наголос] за величиною до тих, що показані, з однаковим знаком.
- кількість бітів для найменшого об'єкта, який не є бітовим полем (байт)
**CHAR_BIT 8**
- мінімальне значення для об'єкта типу, підписаного символом
**SCHAR_MIN -127//−(27−1)**
- максимальне значення для об'єкта типу, підписаного символом
**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.