next up previous contents index
Next: Gestione data e ora Up: Approfondimenti. I files d'intestazione Previous: Argomenti da linea di   Indice   Indice analitico

Tipi primitivi

I tipi primitivi che abbiamo presentato ad inizio corso sono: int, double, char; ad essi abbiamo poi aggiunto bool e unsigned int. In realtà noi abbiamo allegramente sorvolato su altri tipi ugualmente primitivi; essi sono:
short int float unsigned short int
int double unsigned int
long int long double unsigned long int

I tipi appena introdotti sono del tutto simili ai loro corrispondenti già utilizzati, che sono nella seconda riga della tabella; l'unica differenza risiede nella ``capienza'' di essi. Dobbiamo sapere che ogni compilatore C++ utilizza un certo numero fisso (fisso per il compilatore e la macchina, non in assoluto!) di cifre binarie per rappresentare un tipo primitivo; ovviamente, più bit verranno utilizzati, maggiore sarà il range di tale tipo. Ad esempio se supponiamo che un intero senza segno venga memorizzato su 32 bit 8.4, il massimo numero rappresentabile è $2^{32} = 4'294'967'296$: il numero $2^{32} + 1$ manderà dunque la macchina in errore di overflow (lett. ``sovraccarico'').

I tipi elencati nella tabella sono in ordine crescente di memoria occupata: uno short int potrà al più essere memorizzato sullo stesso numero di cifre di un int, che a sua volta potrà al più essere memorizzato sullo stesso numero di cifre di un long int; ragionamento analogo per i numeri reali e per i numeri interi privi di segno. Il numero di cifre sulle quali viene memorizzato un tipo primitivo dipende strettamente dalla macchina utilizzata e dal compilatore; per conoscere le caratteristiche relative ad una specifica macchina, basta utilizzare l'operatore sizeof, il quale accetta come argomento il tipo di cui vogliamo sapere la dimensione in memoria, e torna il numero di bytes di memorizzazione. Vediamo un esempio:


// ex8_4_1
#include <iostream.h>

void main() {
  cout << "short int: " << 
    sizeof(short int) << "\n";
  cout << "int: " << 
    sizeof(int) << "\n";
  cout << "long int: " << 
    sizeof(long int) << "\n";

  cout << "float: " <<
    sizeof(float) << "\n";
  cout << "double: " <<
    sizeof(double) << "\n";
  cout << "long double: " <<
    sizeof(long double) << "\n";

  cout << "unsigned short int: " << 
    sizeof(unsigned short int) << "\n";
  cout << "unsigned int: " << 
    sizeof(unsigned int) << "\n";
  cout << "unsigned long int: " << 
    sizeof(unsigned long int) << "\n";
}

esempio di output:
short int: 2
int: 4
long int: 4
float: 4
double: 8
long double: 12
unsigned short int: 2
unsigned int: 4
unsigned long int: 4

In quali casi dobbiamo utilizzare un tipo piuttosto di un altro? In generale conviene utilizzare sempre i tipi int, double, unsigned int; l'unica eccezione riguarda programmi matematici nei quali l'efficienza (nel senso della velocità di esecuzione e dell'occupazione della memoria) è un fattore molto rilevante. Per i nostri scopi, i tipi appena introdotti non cambieranno i nostri metodi di programmazione.


next up previous contents index
Next: Gestione data e ora Up: Approfondimenti. I files d'intestazione Previous: Argomenti da linea di   Indice   Indice analitico
Claudio Cicconetti
2000-09-06