2015-01-27 21 views
6

Da ISO/IEC 9899:A cosa servono i tipi interi con larghezza minima?

7.18.1.2 tipi interi minima larghezza

1 Il nome typedef int_leastN_t designa un tipo integer firmato con una larghezza di almeno N, numero intero tale che nessuna firmato digitare con una dimensione minore ha almeno la larghezza specificata. Quindi, int_least32_t denota un tipo intero con segno con una larghezza di almeno 32 bit.

Perché dovrei mai usare questo tipo?

Quando sto decidendo quale tipo dovrei prendere per una variabile di cui ho bisogno, allora chiedo a me stesso: "Quale sarà il più grande valore che potrebbe mai essere trasportato?"

Quindi trovo una risposta, controlla qual è il minimo 2 n che è più grande di quello, e prendi il tipo intero esatto corrispondente.

Quindi in questo caso potrei usare anche un numero intero di larghezza minima. Ma perché? Come già so: non sarà mai un valore più grande. Quindi, perché prendere qualcosa che a volte potrebbe coprire ancora di più come ho bisogno?

Tutti gli altri casi posso IMAGIN di dove anche valida come ad esempio:

"Ho un tipo che sarà almeno di dimensione ..." - L'implmentation non può sapere quale sarà il più grande (per esempio) l'input dell'utente che otterrò mai, quindi aggiustare il tipo al momento della compilazione non sarà d'aiuto.

"Ho una variabile in cui non è possibile determinare quale dimensione dei valori sarà trattenuta in fase di esecuzione."

-Come può sapere il compilatore al momento della compilazione? -> Non riesce a trovare anche la dimensione del byte di raccordo.

Quindi, qual è l'utilizzo di questi tipi?

risposta

5

Perché il compilatore sa cosa è meglio per te. Ad esempio, su alcune architetture della CPU, i calcoli che coinvolgono 8 o 16 bit potrebbero essere molto più lenti dei calcoli eseguiti in 32 bit a causa di istruzioni aggiuntive per mascherare operandi e risultati per adattarli alla loro larghezza.

L'implementazione C su Cray Unicos, ad esempio, ha solo un tipo di char a 8 bit, tutto il resto (breve, int, long, long long) è a 64 bit. Se si impone un tipo per essere int16_t o int32_t, le prestazioni possono subire drasticamente a causa dei negozi stretti che richiedono mascheramento, oring e anding. L'utilizzo di int_least32_t consentirebbe al compilatore di utilizzare il tipo nativo a 64 bit.

+0

Upvote per la modifica. Non mi ero reso conto che i tipi "intN_t" potevano essere effettivamente emulati nel software se non altrimenti disponibili. – user694733

+4

@Jens e perché dovrei usare int_least32_t invece di int_fast32_t per quello scopo? – dhein

+0

@Zaibis Perché l'efficienza dello spazio invece della velocità potrebbe essere la tua priorità. – Jens

5

Allora perché prendere qualcosa che a volte potrebbe coprire ancora di più come ho bisogno?

Perché potrebbe non esserci sempre la dimensione necessaria. Ad esempio, nel sistema in cui CHAR_BIT > 8, int8_t non è disponibile, ma è int_least8_t.

L'idea non è che il compilatore indovinerà quanti bit sono necessari. L'idea è che il compilatore disporrà sempre di un tipo che soddisferà il tuo requisito di dimensione, anche se non può offrire un tipo di dimensione esatto.

+0

Ci sarebbe in questo caso per esempio un uint10_t se charbit sarebbe 10? Quindi è solo per scopi di portabilità, che non ho bisogno di controllare il valore di CHAR_BIT da me stesso e non devo fare iofdefs corrispondenti? e ci sono sistemi in pratica dove CHAR_BIT è> 8? – dhein

+3

Tutti i tipi 'intN_t' sono opzionali sui sistemi di complementi non 2. Quindi non sono veramente utili per il codice portatile. Ma 'uint10_t' è consentito dallo standard (N1570: 7.20.1.1.2). Credo che esistano sistemi in cui CHAR_BIT> 8, ma non riesco a ricordare quanto siano rilevanti oggi. – user694733

+1

Al giorno d'oggi i sistemi con CHAR_BIT> 8 sono principalmente DSP http://stackoverflow.com/questions/2098149/what-platforms-have-something-other-than-8-bit-char?lq=1 –

Problemi correlati