Siempre es uno en C99, sección 6.5.3.4:
Cuando se aplica a un operando que tiene el tipo char, unsigned char o firmado char, (o una versión calificada del mismo) el resultado es 1.
Editar: no es parte de su pregunta, pero sí el interés de Harbison y Steele, 3ª ed. (pre c99) pág. 148:
Una unidad de almacenamiento se considera la cantidad de almacenamiento ocupada por un carácter; el tamaño de un objeto de tipo char
es por tanto 1.
Editar: En respuesta a su pregunta actualizada, la siguiente pregunta y respuesta de Harbison y Steele es relevante (ibid, Ex.4 del Cap.6):
¿Está permitido tener una implementación de C en la que el tipo char
puede representar valores que van desde -2,147,483,648 hasta 2,147,483,647? Si es así, ¿qué estaría sizeof(char)
bajo esa implementación? ¿Cuáles serían los rangos de tipo más pequeños y más grandes int
?
Respuesta (ibid, p. 382):
Está permitido (si es un desperdicio) que una implementación utilice 32 bits para representar el tipo char
. Independientemente de la implementación, el valor de
sizeof(char)
siempre es 1.
Si bien esto no aborda específicamente un caso en el que, digamos, los bytes son 8 bits y char
son 4 de esos bytes (realmente imposible con la definición de c99, ver más abajo), el hecho de que sizeof(char) = 1
siempre queda claro en el estándar c99 y Harbison y Steele.
Editar: De hecho (esto es en respuesta a su pregunta upd 2), en lo que respecta a c99 sizeof(char)
está en bytes, de la sección 6.5.3.4 nuevamente:
El operador sizeof produce el tamaño (en bytes) de su operando
así que combinado con la cita anterior, bytes de 8 bits y char
como 4 de esos bytes es imposible: para c99 un byte es lo mismo que a char
.
En respuesta a su mención de la posibilidad de un 7 bit char
: esto no es posible en c99. Según el apartado 5.2.4.2.1 de la norma el mínimo es 8:
Sus valores definidos por la implementación serán iguales o mayores [énfasis mío] en magnitud a los mostrados, con el mismo signo.
- número de bits para el objeto más pequeño que no es un campo de bits (byte)
**CHAR_BIT 8**
- valor mínimo para un objeto de tipo char firmado
**SCHAR_MIN -127//−(27−1)**
- valor máximo para un objeto de tipo carácter firmado
**SCHAR_MAX +127//27−1**
- valor máximo para un objeto de tipo unsigned char
**UCHAR_MAX 255//28−1**
- valor mínimo para un objeto de tipo char
**CHAR_MIN** see below
- valor máximo para un objeto de tipo char
**CHAR_MAX** see below
[...]
Si el valor de un objeto de tipo char se trata como un entero con signo cuando se utiliza en una expresión, el valor de CHAR_MIN será el mismo que el de SCHAR_MIN y el valor de CHAR_MAX será el mismo que el de SCHAR_MAX. De lo contrario, el valor de CHAR_MIN será 0 y el valor de CHAR_MAX será el mismo que el de UCHAR_MAX. El valor UCHAR_MAX será igual a 2 ^ CHAR_BIT - 1.