PDA

Visualizza la versione completa : [C++] Differenze tra i vari tipi di interi: int, short int, long int, ...


paperino00
21-03-2011, 00:15
Salve, non ho capito che differenza c'è tra int, long int, short int e tra float e double, potreste spiegarmelo?

grazie!

MItaly
21-03-2011, 00:34
Hanno range di valori contenibili diversi (e quindi di fatto dimensioni in bit diverse); lo standard C99 garantisce come range minimi (§E ¶1):

short int => [-32767, +32767]
int => [-32767, +32767]
long int => [-2147483647, +2147483647]

ma in generale i limiti possono essere (e in genere sono) maggiori; viene comunque garantito che i range dell'uno siano compresi in quelli degli altri nel seguente ordine:

short int <= int <= long int

Inoltre si richiede che l'int sia l'intero di dimensioni "naturali" per la macchina su cui girerà il codice.

I limiti effettivi sono comunque definiti nell'header <limits.h> (per il C) o in <limits> (per il C++). In genere i limiti usati sulle macchine a 32 bit sono

short int => [-32768, +32767]
int => [-2147483648, +2147483647]
long int => [-2147483648, +2147483647]

Su quelle a 64 le cose variano; su Windows rimangono uguali per questioni di compatibilità, e il tipo che passa a 64 bit è il long long int. Su Linux invece in genere si passa il long a 64 bit.

Per finire, tieni conto che in genere in "short int" e "long int" l'"int" si omette, per cui di solito si scrive semplicemente long e short.

Per quanto concerne i float e i double, il concetto è analogo: i double in genere sono grandi il doppio, per cui c'è più spazio per la mantissa (maggiore precisione) e per l'esponente (si possono rappresentare valori più grandi e più piccoli).

In linea di principio, se non hai particolare esigenze usa gli int per gli interi e i double per i valori in virgola mobile; ottieni così un valore intero dal range adeguato per impieghi "normali" e sicuramente veloce, e valori in virgola mobile in buona precisione senza perdite sensibili in termini di prestazioni.

paperino00
31-03-2011, 22:21
ma l'int e lo short int non sono uguali visto che contengono lo stesso range di valori?
il long int si può usare su un processore a 32 bit?

valia
31-03-2011, 22:25
Allora devi stare attento perché int e short int non hanno lo stesso range, hanno un numero di byte di differenza per rappresentare i valori.
Long int in genere non lo si usa insieme (si usa solo long), ma stai attento a cosa vuole dire long per la macchina (come ti dicevano le dimensioni sono platform dependent)

Celebron
31-03-2011, 22:33
Originariamente inviato da paperino00
ma l'int e lo short int non sono uguali visto che contengono lo stesso range di valori?
il long int si può usare su un processore a 32 bit?

sono uguali in alcuni casi ma non in tutti, come ti hanno spiegato prima
le garanzie che hai sono che short int <= int <= long int

in alcune macchine i tre tipi potrebbero anche avere identico range, in altre potrebbero essere l'uno diverso dall'altro

MItaly
31-03-2011, 22:42
Originariamente inviato da Celebron
in alcune macchine i tre tipi potrebbero anche avere identico range, in altre potrebbero essere l'uno diverso dall'altro
Giusto per rinforzare il discorso con qualche esempio pratico:

sul processore dell'Arduino (ATmega328) i range dei tipi sono 16 bit per lo short, 16 bit per l'int e 32 bit per il long;
su Windows a 32 e 64 bit lo short è 16 bit, l'int e il long sono a 32 bit, e il long long è a 64 bit;
su Linux a 32 bit la situazione è analoga a Windows a 32 bit; su Linux a 64 bit lo short è 16 bit, l'int è a 32 bit e il long è a 64 bit (come il long long).


Nota come in genere il processore è in grado di gestire anche interi più grandi dei suoi "interi nativi": semplicemente sarà più lento a manipolarli (e in genere le operazioni su tali interi non saranno atomiche).

Loading