Corso di C con Linux

I tipi di dati fondamentali

 

Nella lezione 22 abbiamo accennato al fatto che i dati che il nostro programma deve elaborare sono contenuti in variabili.
Nonostante il calcolatore memorizzi tutte le informazioni come sequenze di cifre binarie, noi diamo ad ognuna di esse un significato differente: ad es. possiamo dover lavorare con stringhe di caratteri oppure con valori numerici.
Un byte in cui è memorizzata la sequenza binaria 00111111 può contenere la rappresentazione in complemento a 2 dell'intero 63 oppure la codifica ASCII del carattere '?'; lo stesso byte può dunque rappresentare un valore numerico
o un carattere dell'alfabeto: può contenere cioè valori di tipo diverso.

In C esistono 4 tipi fondamentali:
1. gli interi (rappresentati con la parola chiave int);
2. i valori in virgola mobile, o floating point (rappresentati con la parola chiave float);
3. i valori in doppia precisione (double);
4. i caratteri (char).
Ognuno di questi tipi rappresenta un certo intervallo (range) di valori che una variabile può assumere, dipendente dalla piattaforma.
Per questa ragione, quando si dichiara una variabile occorre indicarne il tipo, in modo che il compilatore possa allocare lo spazio di memoria necessario a contenere tutti i possibili valori che la variabile può assumere.

Una variabile che assume valori interi può essere dichiarata come:

int
long int
short int
unsigned int
unsigned long int
unsigned short int

La differenza tra int, long int e short int risiede nell’ampiezza dell’intervallo di valori che possono assumere, a sua volta legata al numero di bit utilizzati per rappresentare un valore di quel tipo.
Se si premette la parola chiave unsigned viene specificato che la variabile assume solo valori positivi.
La tabella seguente indica il numero di byte utilizzati dagli attuali PC a 32 bit per memorizzare i tipi interi, e quindi gli intervalli di valori che variabili di quel tipo possono assumere:

Tipo

Dimensione in byte

Range

int

4

da –2.147.483.648 a +2.147.483.647

long int

4

da –2.147.483.648 a +2.147.483.647

short int

2

da –32.768 a +32.767

unsigned int

4

da 0 a 4.294.967.295

unsigned long int

4

da 0 a 4.294.967.295

unsigned short int

2

da 0 a 65535


Possiamo notare che nei PC a 32 bit non esiste alcuna differenza tra i tipi int e long int, ma ciò non è vero se si considerano architetture con un diverso grado di parallelismo.
E’ buona prassi di programmazione dichiarare le variabili della minima dimensione sufficiente a contenerle, specificando, quando ciò avviene, se è di tipo unsigned; quest’ultima opzione, del resto, raddoppia il massimo valore positivo che la variabile può contenere.

Per conoscere quanti byte sono utilizzati dalla nostra macchina per memorizzato un certo tipo di dato, si può utilizzare l’operatore sizeof(arg) che restituisce la dimensione di arg espressa in byte.
Ad es. il seguente programma stampa a video le dimensioni associate ai vari tipi interi del C:

#include <stdio.h>

int main(void)
{
        printf("Dimensione int       = %d\n", sizeof(int));
        printf("Dimensione long int  = %d\n", sizeof(long int));
        printf("Dimensione short int = %d\n", sizeof(short int));
        printf("Dimensione unsigned int       = %d\n", sizeof(unsigned int));
        printf("Dimensione unsigned long int  = %d\n", sizeof(unsigned long int));
        printf("Dimensione unsigned short int = %d\n", sizeof(unsigned short int));

        return 0;
}

Il cui risultato su un sistema Intel x086 è:

Dimensione int       = 4
Dimensione long int  = 4
Dimensione short int = 2
Dimensione unsigned int       = 4
Dimensione unsigned long int  = 4
Dimensione unsigned short int = 2

Il risultato ottenuto può non coincidere con quello mostrato sopra nel caso utilizziate un’architettura diversa dalla mia.

Una variabile che può assumere valori in virgola mobile può essere dichiarata come:

float
double

La differenza tra i due tipi precedenti consiste nella precisione con la quale i numeri reali vengono rappresentati; infatti il tipo double utilizza generalmente il doppio dello spazio di memoria del tipo float, fornendo una rappresentazione più accurata (ma anche più complessa da gestire) dei valori reali.
Come esercizio, modificate il programma precedente in modo da visualizzare il numero di byte che la vostra macchina utilizza per questi due tipi di dati.


 

Torna all'indice Generale del corso di Corso di C con Linux di Software Planet