Quando si eseguono molte operazioni con delle variabili sia intere che floating point, non è raro incorrere in diversi tipi di errori. Per evitare di incorrere in questi “warning” perciò cerchiamo di capire cosa accade nella macchina quando inizializziamo una variabile. Quando si crea una variabile si alloca una certa quantità di bit, inizialmente vuota. Questi bit, che possiamo considerare idealmente come delle celle vuote, saranno riempite da dei numeri, più esattamente 0 e 1. Si deve infatti ricordare che noi umani utilizziamo l’algebra con base decimale, mentre il linguaggio macchina, salvo rarissime eccezioni (vedi il tipo Decimal), utilizza base due. Quando noi perciò inizializziamo un valore all’interno di una variabile, la macchina trasformerà quel numero in base 2, e occuperà così i bit fino a quel momento privi di valore, con una sequenza più o meno lunga di 0 e 1.
Ogni tipo di variabile alloca una quantità diversa di bit, ad esempio il tipo Integer alloca 32bit, il tipo Long alloca 64bit; per quanto riguarda i tipi floating point, il tipo Double alloca 64bit, Single 32bit e Decimal 128bit. Per questo motivo il numero di valori che possono essere rappresentati, sia per tipi interi sia per tipi floating point, seppur molto grande è limitato. Inoltre non bisogna dimenticare che una bit viene occupato dal segno + o -. Esistono anche dei tipi unsigned cioè senza segno, ma comportano forti limitazioni poiché il valore minimo che può essere inizializzato è 0.
Quando si utilizzano variabili di tipo intero si rischia di incorrere in errori di overflow, cioè di straripamento. Per capire meglio inizializziamo un numero intero positivo qualsiasi all’interno di una variabile. Ora utilizziamo il comando Int32.MaxValue grazie al quale sarà possibile ottenere il numero intero più grande che può essere contenuto in 32bit. Sommando questo valore e il valore precedentemente allocato in variabile non si otterrà il risultato sperato poiché siamo incorsi in un errore di overflow. Fortunatamente il linguaggio VB.NET è “intelligente”, infatti il programma viene immediatamente bloccato se durante l’esecuzione del codice viene rilevato un errore di questo tipo. La stessa cosa però non può essere detta per il linguaggio C#. Infatti in questo caso il programma non si fermerebbe, ma continuerebbe a eseguire il codice senza problemi. Quando però si va a stampare il risultato della somma precedentemente descritta, ci si rende conto dell’assurdità: il valore risultante è minore del massimo valore allegabile in 32bit. E’ facile quindi intuire la pericolosità di questo errore; se non ci si rende conto, si rischia di commettere errori grandissimi. Fortunatamente però modificando le impostazioni del progetto è possibile attivare un controllo di questo genere di errori anche per C#. Concludiamo il discorso riguardo i tipi interi dicendo che il tipo Int ha un range di variazione +-2147483647, mentre il tipo Long ha range +-9223372036854775808.
Ora spostiamo il discorso sui numeri con la virgola. Innanzitutto va fatta un’osservazione: questo tipo di numeri sono rappresentati da 3 parti che sono rispettivamente il segno, la mantissa (la parte del numero prima della virgola) e l’esponente. Quando si utilizza un numero con la virgola, il linguaggio macchina esegue una conversione in base due utilizzando la notazione scientifica, ma in questo caso la radice sarà 2 e non 10. Per questo motivo quando si utilizza un numero con molte cifre decimali si rischia di incorrere in errori di approssimazione (roundoff error) oltre ovviamente agli errori di overflow dovuti ad un esponente troppo grande. Inoltre si deve tenere in considerazione un’altra cosa: non solo non si potranno rappresentare numeri molto grandi positivi o negativi, ma neanche si potranno rappresentare numeri molto molto piccoli, positivi o negativi. Esiste infatti un intorno di 0 che non potrà essere rappresentato da questo tipo di variabili, poiché l’esponente risulterebbe essere troppo grande; in questo caso si parla di errore di underflow. Va comunque sottolineato che l’intervallo a nostra disposizione è molto grande, infatti per il tipo Single si ha +-3,402829×10^38, mentre per il tipo Double si ha +-1,79769313486232×10^308.
