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 chares 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 charpuede 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 charson 4 de esos bytes (realmente imposible con la definición de c99, ver más abajo), el hecho de que sizeof(char) = 1siempre 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 charcomo 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.