È 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 char
può 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 char
sono 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 char
4 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.