Ci sono macchine, dove sizeof (char)! = 1, o almeno CHAR_BIT> 8?
Domanda
Ci sono macchine (o compilatori), dove sizeof(char) != 1
?
La standard di C99 dice che sizeof(char)
sull'attuazione standard di conformità deve essere esattamente 1? Se lo fa, per favore, mi dia il numero di sezione e citazione.
Aggiornamento:
Se ho una macchina (CPU), che non può affrontare byte (lettura minima è di 4 byte, allineati), ma solo il 4-s di byte (uint32_t
), può compilatore per questa macchina definire sizeof(char)
a 4? sizeof(char)
sarà 1, ma char avrà 32 bit (macro CHAR_BIT
)
Update2: Ma risultato sizeof non è un BYTE! è la dimensione di CHAR. E char può essere di 2 byte, o (può essere) a 7 bit?
Update3:
Ok. Tutte le macchine hanno sizeof(char) == 1
. Ma ciò che le macchine hanno CHAR_BIT > 8
?
Soluzione
E 'sempre uno in C99, punto 6.5.3.4:
Quando viene applicato a un operando che ha tipo char, unsigned char, o firmati char, (o una versione qualificato stessa) il risultato è 1.
Edit: non fa parte della tua domanda, ma per l'interesse di Harbison e Steele, 3a ed. (Pre C99) p. 148:
Modulo contenitore è considerato il quantità di memoria occupata da una carattere; le dimensioni di un oggetto di Tipo
char
è quindi 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 'ammissibile avere un C attuazione in cui
char
tipo può rappresentare valori compresi tra -2,147,483,648 attraverso 2,147,483,647? Se così fosse, quale sarebbesizeof(char)
sotto che l'attuazione? Cosa sarebbe essere gli intervalli più piccoli e più grandi di Tipoint
?
Risposta (ibid, p 382).
Si è consentito (se dispendioso) per un attuazione di usare 32 bit per rappresentare tipo
char
. Indipendentemente da l'attuazione, il valore disizeof(char)
è sempre 1.
Anche se 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 risulta dallo standard C99 e Harbison e Steele.
Edit: In realtà (questo è in risposta alla tua domanda UPD 2), per quanto C99 è sizeof(char)
preoccupato è in byte, dalla sezione 6.5.3.4 ancora:
L'operatore sizeof produce la dimensione (In byte) del suo operando
in modo combinato con la citazione di cui sopra, byte di 8 bit e char
come 4 di questi byte è impossibile. Per C99 un byte è lo stesso di un char
In risposta alla tua menzione della possibilità di un po '7 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 sono uguali 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 char firmato
**SCHAR_MIN -127//−(27−1)**
- valore massimo per un oggetto di tipo char firmato
**SCHAR_MAX +127//27−1**
- valore massimo per un oggetto di tipo char unsigned
**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 intero con segno quando utilizzato in un'espressione, il valore di CHAR_MIN deve essere la stessa di quella di SCHAR_MIN e il valore della CHAR_MAX sarà la stessa di quella di SCHAR_MAX. In caso contrario, il valore di CHAR_MIN è pari a 0 e il valore della CHAR_MAX deve essere la stessa di quella di UCHAR_MAX. Il valore di UCHAR_MAX sarà pari 2 ^ CHAR_BIT -. 1
Altri suggerimenti
Non ci sono macchine in cui è sizeof(char)
4. E 'sempre 1 byte. Che potrebbe contenere byte 32 bit, ma per quanto riguarda il compilatore C è interessato, è un byte. Per maggiori dettagli, sto andando a puntare al C ++ Domande frequenti 26.6 . Tale nesso copre abbastanza bene e sono abbastanza certo C ++ ottenuto tutte quelle norme da C. È anche possibile guardare comp.lang.c FAQ 8,10 per i caratteri più grandi di 8 bit.
UPD2: Ma sizeof risultato non è un BYTE ! è la dimensione di CHAR. E char può essere di 2 byte, o (può essere) a 7 bit?
Sì, è byte. Lasciatemi dire ancora una volta. sizeof(char)
è 1 byte secondo il compilatore C. Quello che la gente colloquialmente chiamata un byte (8 bit) non è necessariamente lo stesso di quello che il compilatore C chiama un byte. Il numero di bit in un byte C varia a seconda architettura della macchina. E 'garantita anche essere almeno 8.
PDP-10 e PDP-11 era.
Aggiornamento: non come nessun compilatori C99 per PDP-10
Alcuni modelli di Analog Devices 32 bit SHARC DSP hanno CHAR_BIT = 32, e Texas Instruments DSP da TMS32F28xx hanno CHAR_BIT = 16, riferito .
Aggiornamento: C'è GCC 3.2 per PDP-10 con CHAR_BIT = 9 (Controllo di includere / limits.h in quell'archivio).