2010-02-07 9 views
86

Esistono macchine (o compilatori), dove sizeof(char) != 1?Ci sono macchine, dove sizeof (char)! = 1 o almeno CHAR_BIT> 8?

C99 standard dice che sizeof(char) su implementazione di conformità standard DEVE essere esattamente 1? Se lo fa, per favore, dammi il numero di sezione e la citazione.

Aggiornamento: Se ho una macchina (CPU), che non possono affrontare byte (lettura minima è di 4 byte, allineato), ma solo il 4-s di byte (uint32_t), può compilatore per questo la macchina definisce sizeof(char) su 4? sizeof(char) sarà 1, ma char avrà 32 bit (CHAR_BIT macro)

Update2: Ma risultato sizeof non è un BYTE! è la dimensione di CHAR. E il carattere può essere 2 byte o (può essere) 7 bit?

Aggiornamento3: Ok. Tutte le macchine hanno sizeof(char) == 1. Ma quali macchine hanno CHAR_BIT > 8?

+0

Di cosa sei veramente preoccupato? Non ti piace chiamare sizeof()? –

+4

Sono preoccupato per la conformità allo standard C99. Lavoro a stretto contatto con i compilatori C99 – osgx

+2

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. –

risposta

86

È 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.

+9

Nota aggiuntiva: c'è una macro CHAR_BITS che ti dirà quanti bit sono i tuoi caratteri. – nos

+1

I dati completi di questo grande libro sono * Harbison e Steele's. C: A Reference Manual, Terza edizione, Prentice Hall, 1991 * – osgx

+0

Sì, grazie per aver inserito il titolo, questo è Harbison e Steele che sto citando sopra (si noti che non copre c99). – Ramashalanka

16

Non ci sono macchine in cui è sizeof(char) 4. E 'sempre 1 byte.Quel byte potrebbe contenere 32 bit, ma per quanto riguarda il compilatore C, è un byte. Per ulteriori dettagli, in realtà ti indicherò allo C++ FAQ 26.6. Quel link lo copre abbastanza bene e sono abbastanza sicuro che C++ abbia tutte quelle regole da C. Puoi anche guardare a comp.lang.c FAQ 8.10 per i caratteri più grandi di 8 bit.

UPD2: Ma risultato sizeof non è un BYTE ! è la dimensione di CHAR. E char can essere 2 byte, o (può essere) 7 bit?

Sì, è byte. Lasciatemelo dire ancora. sizeof(char) è 1 byte in base al compilatore C. Ciò che la gente chiama colloquialmente 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 in base all'architettura della macchina. E 'anche garantito di essere almeno 8.

+2

Per favore !!! C++ è il linguaggio veramente DIVERSO da C (C99). Questa domanda riguarda solo C semplice. – osgx

+0

Cosa posso fare quando la macchina/CPU non possono accedere a byte da 8 bit? L'accesso non allineato è proibito. (Anche su x86 malloc restituisce i dati allineati e alloca la memoria in multipli di 4 byte.) Quindi CHAT_BIT sarà maggiore di 8. Sì, tale piattaforma può essere piuttosto speciale. osgx

+9

@osgx, tendo ad urlare quanto hai appena fatto quando le persone provano a mixare C e C++. Ma penso ** in questo caso ** che una delle domande frequenti su C++ si applica ugualmente bene a C. –

8

PDP-10 e PDP-11 era.

Aggiornamento: non ci sono compilatori C99 per PDP-10.

Alcuni modelli di Analog Devices 32 bit SHARC DSP avere CHAR_BIT = 32, e Texas Instruments DSP da TMS32F28xx avere CHAR_BIT = 16, reportedly.

Aggiornamento: C'è GCC 3.2 for PDP-10 con CHAR_BIT = 9 (controllare include/limits.h in quell'archivio).

+1

Non confondere le implementazioni di linguaggi simili ma non a C. Hai persino detto "Sono preoccupato per la conformità allo standard C99. Lavoro a stretto contatto con i compilatori C99". –

+1

@Roger: Non è giusto chiamare GCC3 non conforme a C99 a meno che non si abbia a che fare con casi limite estremi che sono considerati bug in GCC. – Joshua

+1

@Joshua, penso che Roger dica di K & R e dei compilatori storici di pcc. Non è giusto pretendere che sia conforme a C99 prima che C99 compliance suite venga eseguita su PDP-10, quando viene compilato con questa porta (possono esserci errori dal porting e dalla macchina stessa). Ma ci si può aspettare che sia vicino allo standard C99 come GCC3.2 su x86. – osgx

Problemi correlati