È sempre una in C99, sezione 6.5.3.4:
Quando applicato ad un operando che ha tipo char, unsigned char, o firmato char, (o una versione qualificato della stessa) la il risultato è 1.
Modifica: non parte della tua domanda, ma per interesse da Harbison e Steele, 3a ed. (pre c99) p. 148:
Modulo contenitore è considerato il quantità di memoria occupata da uno carattere; le dimensioni di un oggetto di tipo char
è dunque 1.
Edit: In risposta alla tua domanda aggiornato, la seguente domanda e la risposta da Harbison e Steele è rilevante (. ibid., Ex 4 di Ch 6) :
E 'consentito di avere un'implementazione C in quale tipo char
può rappresentare i valori che vanno da -2.147.483.648 attraverso 2,147,483,647? In tal caso, quale sarebbe sizeof(char)
nell'ambito di tale implementazione? Che cosa sarebbe le gamme più piccole e più grandi di tipo int
?
Risposta (ibid, p 382).:
È consentito (se dispendioso) per un attuazione di usare 32 bit per rappresentare tipo char
. Indipendentemente dall'implementazione di , il valore di sizeof(char)
è sempre 1.
Mentre questo non risolve specificamente un caso in cui, dicono byte sono 8 bit e char
sono 4 di questi byte (effettivamente impossibili con la definizione C99, vedi sotto), il fatto che sizeof(char) = 1
è sempre chiaramente dalla c99 standard e Harbison e Steele.
Edit: In realtà (questo è in risposta alla tua domanda UPD 2), per quanto C99 concerne sizeof(char)
è in byte, dalla sezione 6.5.3.4 ancora:
Il sizeof rendimenti operatore la dimensione (in byte) del suo operando
modo combinato con la citazione di cui sopra, byte di 8 bit e char
come 4 di tali byte è impossibile: per C99 un byte è lo stesso di un 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 della norma del minima è 8:
I loro valori di implementazione definiti devono essere uguale o superiore [corsivo mio] in grandezza a quelli indicati, con lo stesso segno.
- numero di bit per più piccolo oggetto che non è un campo di bit (byte)
**CHAR_BIT 8**
- valore minimo per un oggetto di tipo firmato char
**SCHAR_MIN -127//−(27−1)**
- valore massimo per un oggetto del tipo firmato 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 considerato come un intero con segno Quando viene utilizzato in un'espressione, il valore di CHAR_MIN deve essere uguale a quello di SCHAR_MIN e il valore di CHAR_MAX deve essere uguale a quello di SCHAR_MAX. In caso contrario, il valore di CHAR_MIN deve essere 0 e il valore di CHAR_MAX deve essere uguale a quello di UCHAR_MAX. Il valore UCHAR_MAX sarà uguale al 2^CHAR_BIT - 1.
Di cosa sei veramente preoccupato? Non ti piace chiamare sizeof()? –
Sono preoccupato per la conformità allo standard C99. Lavoro a stretto contatto con i compilatori C99 – osgx
Poiché Unicode diventa ancora più importante, potrebbero venire compilatori non standard che usano caratteri Unicode come 'char' (invece di' wchar'.) Anche se lo standard dice che 'sizeof (char)' deve essere 1, non fare affidamento su tale ipotesi. –