Corso di Visual Basic: | |||||||||||||||||||
Tredicesima lezione - Estensione della logica binaria (a cura di
Giorgio Abraini) Nella lezione 8 abbiamo visto cosa sono i bit, i byte e come funziona la logica binaria che sta alla base dei moderni computer: seguendo questa logica abbiamo capito che un byte può contenere un valore compreso tra 0 e 255, due byte possono contenere un valore compreso tra 0 e 65535, e così via. Tuttavia, questo è vero solo se si usa una logica strettamente binaria: nulla però impedisce di considerare una sequenza di bit in un modo leggermente diverso, secondo la nostra convenienza; potremmo cioè suddividere una sequenza di bit in uno o più gruppi aventi significati diversi. In altre parole, i bit possono essere organizzati in modo tale che possano assumere un valore diverso da quello che avrebbero secondo il sistema binario puro e semplice: questo è proprio ciò che si fa per permettere al calcolatore di considerare i numeri negativi. Una variabile di tipo Integer, ad esempio, consta di 16 bit (2 byte) e secondo il sistema binario dovrebbe poter assumere valori da 0 fino a 65535, mentre in realtà sappiamo che il suo intervallo di valori va da -32768 a +32767, ovvero da -2^15 a +2^15 - 1. E' chiaro quindi che il valore assoluto del numero memorizzato in una variabile Integer è rappresentabile soltanto con 15 bit, e non con 16: che fine ha fatto il sedicesimo bit? E' facile intuire che il sedicesimo bit è utilizzato per rappresentare il segno del numero; in fin dei conti non cambia nulla: l'intervallo -32768/+32767 ha lo stesso numero di elementi dell'intervallo 0/65535 (in entrambi i casi infatti il numero di valori possibili è 65536 = 2^16), però grazie al "trucco" di utilizzare un bit come un bit di segno abbiamo la possibilità di usare anche i numeri negativi. Per la precisione, il bit di segno è il bit più significativo, ovvero quello più a sinistra (ricordate sempre che i bit si contano a cominciare da destra), e gli altri quindici sono usati per indicare il numero vero e proprio; quindi il modo in cui gli Integer vengono memorizzati nella memoria del computer è schematizzabile in questo modo:
Contrariamente a quanto si potrebbe pensare, però, il numero -1453 NON è rappresentato così:
bensì è rappresentato così:
Il motivo di questo strano fenomeno è che per il computer il numero -1453 non è banalmente il numero 1453 con "un meno davanti", ma è quel numero che, sommato a 1453, restituisce 0: infatti se provate a fare la somma (nel sistema binario, quindi scrivendo 0 "col riporto di 1" quando la somma di due bit è uguale a 2)
troverete che il risultato della somma è un 1 seguito da 16 zeri; poiché noi stiamo considerando gli Integer, i bit che ci interessano sono solo gli ultimi 16, e quindi dell'1 iniziale possiamo fregarcene tranquillamente: quello che resta è 0, che è proprio il risultato della somma algebrica 1453 + (-1453). Tutto ciò sembra molto macchinoso, ma c'è un modo molto semplice per trovare la rappresentazione binaria di un numero negativo, conoscendo quella del corrispondente numero positivo: la rappresentazione binaria di -x è uguale a (not x) +1: prendete la rappresentazione binaria di 1453, cambiate ogni bit (cioè applicate l'operatore not ad ogni singolo bit) e infine aggiungete 1 al risultato ("aggiungere" nel senso di fare la somma, non nel senso di scriverlo in fondo come se fosse il diciassettesimo bit!): troverete esattamente la rappresentazione binaria di -1453. Lo stesso discorso naturalmente può essere applicato anche agli altri tipi numerici (Long, Single, Double, ecc.): infatti in Visual Basic tutti i tipi di dati numerici, ad eccezione del tipo byte, sono "con segno", cioè utilizzano il bit più significativo come bit di segno. Una particolare organizzazione dei bit consente anche di rappresentare i numeri frazionari, oppure di rappresentare i numeri secondo la notazione scientifica (con una mantissa e un esponente) come avviene nei Single e nei Double. Svelato l'arcano mistero dei numeri negativi, passiamo ai vettori di variabili: spesso si ha necessità di utilizzare più di una variabile dello stesso tipo per effettuare una stessa operazione; ad esempio, per calcolare la media di 10 valori ho bisogno di sommare questi 10 valori e dividere la somma per 10: a tale scopo potrei utilizzare 10 variabili diverse, che naturalmente vanno dichiarate una per una, più o meno in questo modo:
E se a un certo punto dovessi aver bisogno di fare la media non più di 10 valori, ma di 20 valori, dovrei dichiarare altre 10 variabili, impostare il valore opportuno per ciascuna di esse, sommarle alle 10 dichiarate in precedenza, e infine dividere la somma per 20! E' chiaro che questo modo di procedere è a dir poco laborioso: in questi casi è estremamente conveniente utilizzare i vettori, ovvero un insieme di variabili dello stesso tipo e con lo stesso nome, distinguibili le une dalle altre solo tramite un indice. La dichiarazione di un vettore di variabili si fa scrivendo tra parentesi il numero di elementi che deve avere il vettore: per esempio nel nostro caso potremmo scrivere:
Avremo così a disposizione 10 variabili (anzi, in realtà 11 come spiegherò tra poco) di tipo Integer di nome Var: la prima variabile che ci interessa sarà Var(1), la seconda Var(2), ecc. fino alla decima, Var(10). Nella dichiarazione, il numero indicato tra parentesi indica il limite superiore del vettore, ovvero il valore massimo che può assumere l'indice: se provassimo a scrivere, ad esempio:
otterremmo un errore, perché il limite massimo dell'indice è 10. Il limite superiore deve essere compreso nell'intervallo di valori valido per il tipo Long (-2147483648/+2147483647): da ciò segue che è possibile specificare come limite superiore anche un valore negativo, ma bisogna tenere presente un paio di cose. Prima di tutto, così come c'è un limite superiore, c'è anche un limite inferiore per l'indice: se non è specificato nella dichiarazione, questo limite inferiore è per default 0; pertanto scrivendo:
l'indice di questo vettore potrà andare da 0 a 10, e quindi il vettore avrà 11 elementi; se si desidera che l'indice parta sempre da 1 anziché da 0, è possibile utilizzare l'istruzione:
Questa istruzione, come l'analoga Option Explicit va inserita nella sezione generale del form. Però è anche possibile indicare entrambi i limiti, quello inferiore e quello superiore, nella dichiarazione stessa, usando la parola chiave To:
indica un vettore con 10 elementi, il cui indice va da 1 a 10; analogamente si potrà scrivere:
oppure:
e così via. La seconda cosa da tenere presente è che, ovviamente, il limite inferiore deve sempre essere minore del limite superiore: perciò è sbagliato scrivere
ed è anche sbagliato scrivere:
perché in questo caso il limite inferiore implicito è 0 o 1, che è maggiore di -5. |
Archivio: | ||||
Lezioni | Commenta questa lezione | Invia la tua guida | Avviso
per le nuove lezioni | Proponi
un argomento |
Visual Basic Italia©
copyright 2000 - tutti i diritti riservati |