2012-05-27 6 views
16

Ho letto un paio di volte in diverse fonti (ad esempio Wikipedia: http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Size), che in C, una lunga non è più piccola di una lunga, che non è più piccola di una int, che non è più piccola di una breve."int" ha davvero bisogno di essere grande almeno quanto "corto" in C?

Tuttavia, ho esaminato questo negli standard C90 e C99 e non ho trovato una clausola corrispondente. Ho trovato solo che C90 e C99 specificano le dimensioni minime del tipo (Sezione 5.2.4.2.1 negli standard C90 e C99), ma non le loro dimensioni in relazione l'una con l'altra. Ho perso qualcosa negli standard?

+4

No, ma non ho visto una piattaforma che rende 'short' più grande di' int' ... ed è proprio per questo che uso '', ogni volta che sono in dubbio su cose del genere –

risposta

13

6.3.1.1 definisce le relative conversione integer ranghi di altri due tipi interi. Questo è un concetto astratto che intende solo definire la relazione tra due tipi; non esiste un valore definito come rank di alcun tipo.

6.2.5p8 dice:

Per ogni due tipi interi con lo stesso signedness e diverso intero rango di conversione (vedi 6.3.1.1), l'intervallo di valori del tipo con rank di conversione intero più piccolo è un subrange dei valori di l'altro tipo.

Non dice nulla circa le relative dimensioni , e in effetti è teoricamente possibile che un conforme (ma deliberatamente perversa) l'attuazione di avere sizeof (short) > sizeof (int). Questo è possibile solo se short ha più bit di riempimento (bit che non contribuiscono al valore) rispetto a int. Questo è molto improbabile; la maggior parte delle implementazioni non ha alcun bit di riempimento e non conosco implementazioni in cui le relazioni degli intervalli dei tipi interi differiscono dalle relazioni delle loro dimensioni.

Riferimento: N1256, l'ultima bozza C99 o N1570, l'ultima bozza C2011.

+0

Grazie per le informazioni aggiuntive :) –

10

Si considera che l'articolo Wikipedia si riferisce al campo valore di tali tipi interi, piuttosto che la loro dimensione (come riportato da sizeof).

Da C99 standard draft N1256:

6.3.1.1/1

Il rango di long long int deve essere superiore al rango di long int, che deve essere superiore al rango di int, che deve essere maggiore del grado short int, che deve essere maggiore del valore di signed char.

6.2.5/8

Per ogni due tipi interi con lo stesso signedness e diverso rango conversione integer (vedi 6.3.1.1), l'intervallo di valori del tipo con minore rank di conversione intero è un sub-intervallo dei valori dell'altro tipo.

+0

Che non funziona rispondi completamente alla domanda Il grado di conversione relativo in realtà non implica nulla sulla dimensione relativa. –

6

Da C2011 Standard

6.3.1.1/1

- Il rango di long long int deve essere superiore al rango di long int, che deve essere superiore a il grado di int, che deve essere maggiore del grado breve int, che deve essere maggiore del grado firmato char.

Problemi correlati