È sempre uno in C99, sezione 6.5.3.4:
Quando applicato a un operando di tipo char, unsigned char o signed char (o una sua versione qualificata) il risultato è 1.
Modifica: non fa parte della tua domanda, ma per l'interesse di Harbison e Steele, 3a ed. (pre c99) p. 148:
Un'unità di memoria è considerata la quantità di memoria occupata da un carattere; la dimensione di un oggetto di tipo charè quindi 1.
Modifica: in risposta alla tua domanda aggiornata, la seguente domanda e risposta di Harbison e Steele è rilevante (ibid, Es. 4 del cap. 6):
È consentito avere un'implementazione C in cui il tipo charpuò rappresentare valori compresi tra -2.147.483.648 e 2.147.483.647? In caso affermativo, cosa ci sarebbe sizeof(char)
in tale implementazione? Quali sarebbero le gamme di caratteri più piccole e più grandi int?
Risposta (ibid, p. 382):
È consentito (se dispendioso) per un'implementazione utilizzare 32 bit per rappresentare il tipo char. Indipendentemente dall'implementazione, il valore di
sizeof(char)è sempre 1.
Anche se questo non riguarda specificamente un caso in cui, diciamo, i byte sono 8 bit e charsono 4 di quei byte (in realtà impossibile con la definizione c99, vedi sotto), il fatto che sizeof(char) = 1è sempre chiaro dallo standard c99 e da Harbison e Steele.
Modifica: In effetti (questo è in risposta alla tua domanda di aggiornamento 2), per quanto riguarda c99 sizeof(char) è in byte, dalla sezione 6.5.3.4 di nuovo:
L'operatore sizeof restituisce la dimensione (in byte) del suo operando
così combinato con la citazione sopra, byte di 8 bit e char4 di quei byte è impossibile: per c99 un byte è uguale a char.
In risposta alla tua menzione della possibilità di un 7 bit char: questo non è possibile in c99. Secondo la sezione 5.2.4.2.1 dello standard il minimo è 8:
I loro valori definiti dall'implementazione devono essere di grandezza uguale o maggiore [enfasi mia] a quelli indicati, con lo stesso segno.
- numero di bit per l'oggetto più piccolo che non è un campo di bit (byte)
**CHAR_BIT 8**
- valore minimo per un oggetto di tipo signed char
**SCHAR_MIN -127//−(27−1)**
- valore massimo per un oggetto di tipo signed char
**SCHAR_MAX +127//27−1**
- valore massimo per un oggetto di tipo unsigned char
**UCHAR_MAX 255//28−1**
- valore minimo per un oggetto di tipo char
**CHAR_MIN** see below
- valore massimo per un oggetto di tipo char
**CHAR_MAX** see below
[...]
Se il valore di un oggetto di tipo char viene trattato come un numero intero con segno quando viene utilizzato in un'espressione, il valore di CHAR_MIN deve essere lo stesso di SCHAR_MIN e il valore di CHAR_MAX deve essere lo stesso di SCHAR_MAX. In caso contrario, il valore di CHAR_MIN sarà 0 e il valore di CHAR_MAX sarà lo stesso di UCHAR_MAX. Il valore UCHAR_MAX è uguale a 2 ^ CHAR_BIT - 1.