2011-08-26 9 views
10

Quando leggo del codice, per numero intero, usano un gruppo di tipi diversi come size_t, uint32, uint64 ecc. Qual è la motivazione o lo scopo per farlo? Perché non usare solo int? Correlato a platform-cross? O di livello basso pertinente.Motivazione per l'utilizzo di size_t uint32 uint64 ecc.

A volte, il codice ha senso per me perché vogliono solo 32 bit int o qualcosa del genere. Ma, che cos'è size_t? Per favore aiutatemi a chiarire questo punto.

risposta

15

Questi sono per indipendenza dalla piattaforma.

size_t è, per definizione, il tipo restituito da sizeof. È abbastanza grande da rappresentare l'oggetto più grande sul sistema di destinazione.

Non molti anni fa, 32 bit sarebbe stato sufficiente per qualsiasi piattaforma. 64 bit sono sufficienti oggi. Ma chissà quanti bit saranno necessari tra 5, 10 o 50 anni da adesso?

Scrivendo il codice non preoccuparsi - vale a dire, utilizzare sempre size_t quando si intende "dimensione di un oggetto" - è possibile scrivere codice che effettivamente compilare ed eseguire 5, 10, o 50 anni da oggi. O almeno hai una possibilità di combattere.

Usa i tipi per dire cosa intendi. Se per qualche motivo hai bisogno di un numero specifico di bit (probabilmente solo quando si ha a che fare con un formato definito esternamente), usa un tipo specifico per dimensione. Se vuoi qualcosa che è "la naturale dimensione della parola della macchina" - cioè, veloce - usa int.

Se avete a che fare con una programmatica come sizeof o strlen, utilizzare il tipo di dati appropriato per l'interfaccia, come size_t.

E non tentare mai di assegnare un tipo a un altro a meno che non sia abbastanza grande da contenere il valore per definizione.

+6

'puoi scrivere codice che verrà compilato ed eseguito in 5, 10 o 50 anni da adesso' +1 per l'ottimismo :-) – Praetorian

+2

Beh, non in C, ma ho il codice che è stato scritto nel 1996 e ancora compila e piste. 15 anni!

2

Per info su size_t, vedi la domanda Stack Overflow: What is size_t in C?

Hai ragione per Uint32 e uint64 che stanno solo di essere specifico circa il numero di bit che vorrebbero, e che il compilatore dovrebbe interpretarli come non firmati.

+1

Il compilatore può interpretare 'uint32_t' e' uint64_t' come uno dei vari tipi senza segno. Ad esempio, 'uint32_t' potrebbe essere sia unsigned int o unsigned long (o potrebbe non esistere se il sistema non ha un tipo che ha esattamente 32 bit). Il punto è che tu * sai * uint32_t è esattamente a 32 bit; tutto ciò di cui si può essere sicuri per 'unsigned int' è che è almeno di 16 bit. –

1

Ci sono molte possibili ragioni per la scelta di un tipo sottostante per un valore intero. La più ovvia è la dimensione del massimo valore possibile che è possibile memorizzare - uint32 sarà in grado di memorizzare un numero due volte più grande di int32, che potrebbe essere desiderabile. int64 sarà in grado di memorizzare un numero molto più grande di int32 - fino a 2^63 - 1 invece di 2^31 - 1.

Ci sono altre possibili ragioni pure. Se stai leggendo direttamente dati binari da una fonte (file, socket, ecc.), È necessario assicurarsi che sia interpretato correttamente. Se qualcuno scrive uint32 e lo interpreti come int32, è possibile che tu interpreti un numero positivo molto grande come numero negativo (overflow).

size_t è solo un typedef per un unsigned int, in genere 32 bit credo.

1

Per la maggior parte la programmazione giorno per giorno, la dimensione di un numero intero non importa più di tanto. Ma a volte è bello essere specifici. Ciò è particolarmente utile nella programmazione di basso livello o incorporata. Un altro posto è utile per attività scientifiche o computazionalmente intensive dove potrebbe essere inutile usare un int che è più grande del necessario.

Il vantaggio di size_t è che non è firmato. Da un lato è bello usare size_t perché aggiunge più informazioni su quale dovrebbe essere l'argomento (cioè non negitave). D'altra parte è meno vincolante contro unsigned int.

+1

Essere specifici (uint64_t, int32_t, ecc.) È anche molto importante quando si scrive su un file, specialmente se il file deve essere usato anche su altre piattaforme, o se dovrebbe sopravvivere a una mossa, diciamo, da 32 a Piattaforma o destinazione a 64 bit. –

3

La motivazione di usarli è perché non si può fare affidamento su int, short o long di avere qualsiasi dimensione particolare - un errore fatto da troppi programmatori troppe volte in passato. Se guardi non troppo indietro nella storia, c'è stata una transizione dai processori a 16 bit a 32 bit, che ha rotto un sacco di codice perché le persone si erano erroneamente affidate a int a 16 bit. Lo stesso errore è stato fatto da allora in poi quando le persone si affidavano allo int per essere 32 bit, e lo fanno ancora fino ad oggi.

Per non parlare dei termini int, short e long sono stati davvero affascinati dai progettisti di linguaggi che decidono tutti di far loro dire qualcosa di diverso. Un programmatore Java che legge alcuni C si aspetta ingenuamente che long significhi 64 bit. Questi termini sono veramente privi di significato - non specificano nulla di un tipo, e faccio facepalm ogni volta che vedo una nuova lingua rilasciata che usa ancora i termini.

I tipi standard int erano una necessità, quindi è possibile utilizzare il tipo che si desidera utilizzare. Dovrebbero averlo deprecato int, short e long decenni fa.

+0

I tipi "generici" int', 'short' e' long', ma anche 'size_t', ecc. Dovrebbero essere IMO preferito per la maggior parte del codice, dove la dimensione esatta del tipo non è veramente importante. Solo se la dimensione esatta conta, devono essere usati i tipi "a dimensione fissa" come "uint32_t" o "int64_t". Si noti che sono mappati ai tipi 'int',' long int', ecc. Che hanno quella dimensione per l'implementazione. –

+2

Ma come si fa a scegliere se usare 'int',' short' o 'long'? Se la dimensione non è importante, perché abbiamo bisogno di 3 parole chiave diverse che daranno la stessa cosa: un tipo intero di cui non conosciamo le dimensioni. –

+0

Se è necessario solo un numero piccolo, usare 'short'. Se hai bisogno di uno grande, usa 'long'. Si noti che, ad esempio, su una piattaforma a 16 bit, l'uso di 'int32_t' sarebbe eccessivo e piuttosto inefficiente (probabilmente richiede due registri). Su una piattaforma di questo tipo, 'int' è probabilmente anche 16 bit e molto più efficiente. –