Programmazione.html.it

  Home page

   Guida Base

   Guida al Java

   Guida al C

   Guida al C++

   Guida al Delphi

   Guida a VB .NET

   Guida al Visual Basic

   Guida al Python

   Guida al'UML

  Forum di discussione
  HTML.it




Guida al linguaggio C
  LEZIONE:  Le variabili in C


In C esistono vari tipi di variabili, questo per venire incontro sia all'esigenze di rappresentabilità di grossi numeri sia al maggior risparmio di memoria possibile, utilizzando di volta in volta il tipo più adeguato ad una specifica situazione. Nella tabella seguente sono mostrati i vari tipi, con la parola che in C ne consente l'uso (char per carattere, int per intero e così via), una spiegazione sui dati che possono rappresentare ed il numero di byte necessari, all'interno del C, per la loro rappresentazione:

Tipi di dichiarazione
Rappresentazione
N. di byte
Char
Carattere
1 (8 bit)
Int
Numero intero
2 (16 bit)
Short
Numero intero "corto"
2 (16 bit)
Long
Numero intero "lungo"
4 (32 bit)
Float
Numero reale
4 (32 bit)
Double
Numero reale "lungo"
8 (64 bit)

Il tipo char è adibito a contenere uno ed un solo carattere; questa imposizione, scomoda quando vogliamo memorizzare una successione di caratteri, è stata risolta in alcuni linguaggi adottando il tipo string (stringa), mentre in C questa situazione viene risolta utilizzando un array di char, l'array è, a tutti gli effetti, un contenitore di variabili dello stesso tipo, per questo ne parleremo in dettaglio nella lezione 10. Ritornando al nostro char, esso può contenere un qualsiasi carattere definito secondo lo standard ASCII e quindi potrà contenere qualsiasi lettera (maiuscola o minuscola), cifra (da 0 a 9) e simbolo previsto dalla codifica. Per dichiarare ed inizializzare una variabile char, ad esempio inizializzandola con la lettera 'r', basta scrivere:

    char a = 'r';

Il tipo int è, invece, quello che permette di contenere dei numeri; il tipo int ha le sue due varianti che sono short e long, anche se in realtà un tipo int è già di per se' un tipo short, mentre il long permette di estendere (utilizzando due byte in più) il range dei valori che il tipo int può assumere, questo per venire incontro all'esigenza di lavorare con grandi numeri. Il tipo int contiene numeri, appunto, interi, quelli che in matematica vengono chiamati numeri naturali, e cioè senza la virgola e parti frazionate. Qui di seguito presentiamo un pezzo di codice in cui vengono dichiarate ed inizializzate variabili int e, per far capire come il fatto che int rappresenti i numeri naturali comporti una certa attenzione, verrà eseguita l'operazione di divisione tra due interi (utilizzando l'operatore di divisione / ):

    int x = 7;
    int y = 3;
    int z;

    z = x / y;
    // z vale 2, cioè la parte intera della divisione tra 7 e 3

I tipi float e double sono chiamati anche numeri in virgola mobile, cioè quelli che in matematica vengono chiamati numeri reali, e quindi possono essere usati per contenere tutti quei numeri che hanno parti frazionarie. La differenza tra i due sta solamente nei bit che sono riservati per la loro rappresentazione, che si va a riflettere, non solo nel range di rappresentazione, ma anche nel numero di cifre dopo la virgola che possono essere rappresentate, in questo caso risulta, quindi, più accurata la rappresentazione utilizzando i double. Qui di seguito presentiamo un semplice pezzo di codice (utilizzando i double) per far vedere come, a differenza degli int, venga rappresentata la divisione tra due numeri in virgola mobile:

    double x = 7.0
    double y = 2.0
    double z;

    z = x / y
    // z vale 3.5

Da notare che la notazione usata per rappresentare la virgola è quella inglese, cioè quella in cui si usa un punto (e non una virgola) per dividere la parte intera da quelle frazionaria.

ESEMPIO PRATICO (Visualizza il sorgente completo)
All'interno del programma di esempio vengono utilizzate molte variabili; ecco alcune dichiarazioni per far capire l'importanza che le variabili ricoprono all'interno del programma.

62        int scelta;
[...]
296       int subscelta;
297       int i=1;
298       int n=1;
[...]
367       int subscelta;
368       int i=1;
369       int n=1;
[...]
469       int index=0; // inizializza l'indice
[...]
554       int i = 0;
[...]
576       char invio;


Numeri con segno e senza segno
In termini di rappresentabilità c'è da far notare che l'uso dei bit per rappresentare un determinato tipo varia a seconda che quel tipo sia signed (con segno) o unsigned (senza segno); questo è dovuto al fatto che se un tipo è formato, ad esempio, da 8 bit come l'intero 114, che di default è signed, si useranno 7 bit per rappresentare il numero e 1 bit (quello più a sinistra, detto anche bit più significativo) per rappresentare il segno (che è '+' se il bit vale 0 ed è '-' se il bit vale 1):

    01110010 // rappresenta, in bit, l'intero 114
    11110010 // cambiando il bit più a sinistra si ottiene l'intero -114

Mentre, se avessimo utilizzato un unsigned int, i valori sarebbero stati tutti positivi, perché anche il bit più significativo sarebbe stato usato per rappresentare il numero:

    01110010 // rappresenta, in bit, l'intero 114
    11110010 // rappresenta, in bit, l'intero 242

Ammesso di avere n bit per rappresentare un numero, se è signed, allora i valori possibili saranno compresi tra -2n +1 e 2n, quindi, nel caso di una rappresentazione ad 8 bit si avrebbero valori compresi tra -127 e 128, questo perché tra i numeri entro il range deve essere considerato anche lo zero.
Nel caso di un unsigned, invece i valori, come già detto, sono tutti positivi e possono assumere valori compresi tra 0 e 2n - 1, ritornando al caso degli 8 bit si avrebbero valori compresi tra 0 e 255.





Torna a inizio pagina