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?

È stato utile?

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 sarebbe sizeof(char)   sotto che l'attuazione? Cosa sarebbe   essere gli intervalli più piccoli e più grandi di   Tipo int?

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 di   sizeof(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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top