- Sistemi di numerazione (binario, decimale,
esadecimale)
-
- Salve a tutti sono sempre Quequero, in questo articolo parleremo
dei vari sistemi di numerazione che sono molto utilizzati nei linguaggi di programmazione
e ci serviranno per comprendere molte cose.
Inizierò col parlare del sistema decimale che tutti conosciamo e che utilizziamo ogni
dì.
Questo sistema viene detto "decimale" perchè utilizza le potenza di...dieci,
per farvi capire cosa intendo ecco un esempio alquanto banale, proviamo a scomporre il
numero 1258:
- 1258 = 1x10^3 + 2x10^2 + 5x10^1 + 8x10^0
- Per verificare se abbiamo fatto bene la scomposizione proviamo a
moltplicare ogni valore per la sua potenza di 10 e poi lo sommiamo agli altri:
-
-
1x10^3
= 1000 +
2x10^2 = 200 +
5x10^1 = 50 +
8x10^0 = 8 =
--------------------
1258
- sembra che il risultato sia esatto, ciò vuol dire che siamo stati
bravi ;))
Bene bene, questo è stato solo un ripasso per introdurre il sistema di numerazione
binario, cioè quello usato dai nostri processori e comunque anche da qualunque componente
elettronico, (calcolatrici, orologi digitali, radio, gps, modem, stereo ecc...) spero che
vi siate chiesti almeno una volta come fa il computer ad aprire una finestra oppure una
calcolatrice ad eseguire un calcolo "2-1", ebbene tutti i processori riescono a
capire la differenza tra due stati di tensione cioè: 0 (potenziale basso) e 1 (potenziale
alto), ecco l'importanza di questo sistema, ma come possiamo convertire un numero binario
in decimale?
Dal momento che conosciamo tutti i numeri binari (1 e 0 :) creiamo un numerino e
convertiamolo, prendiamo per esempio questo:
-
- 11001011 = 1x2^7 + 1x2^6 + 0x2^5 + 0x2^4 + 1x2^3 + 0x2^2 + 1x2^1+
1x2^0
- 1x2^7 = 128 + \
1x2^6 = 64 + \
0x2^5 = 0 + |
0x2^4 = 0 + ---- numeri
binari convertiti in
1x2^3 = 8 + |
decimali e sommati tra loro
0x2^2 = 0 + |
1x2^1 = 2 + /
1x2^0 = 1 = /
----------
203
-
- Il risultato 203 è esatto? Verifichiamolo.....ma come possiamo
farlo se finora abbiamo imparato solo a scomporre un numero in potenze di dieci e a
convertire un binario in decimale?
Bhè semplice dovete riaprire i libri di matematica, ma non vi preoccupate perchè
Quequero lo farà per voi ;))
Ecco come si fà:
-
-----------------
¦ Numero decimale ¦
-----------------
¦¦
¦¦
Dividiamo per 2 <---¦
¦¦
¦
----------------------
--- ¦
¦ Il quoziente è
pari? ¦ ¦
-------------------------
¦
¦¦
¦
¦¦
¦
SI
/ \ NO
¦
/
\
¦
-------
-------
¦
/
\
¦
-------------
-------------
¦
Scriviamo 0 ¦ ¦ Scriviamo 1 ¦
¦
-------------
-------------
¦
\
/
¦
\------------------/
¦
¦¦
¦
¦¦
¦
---------------------
¦
¦ Il numero è finito? ¦
¦
---------------------
¦
¦¦
¦
¦¦
¦
SI
/ \ NO
¦
/
\
¦
-------
-------
¦
/
\
¦
-------------------
----------
¦
¦ Prendi tutte le ¦ ¦ Continua ¦ -----
¦ cifre e ribaltale ¦ ----------
-------------------
- Bello il logaritmo vero? Spero di si, proviamo a vedere se 203
corrisponde realmente a 11001011, per farlo usiamo la colonnina che tanto odiavamo alle
elementari:
- 203|
101|1
51|1
25|0
12|1
6|0
3|0
1|1
0|1
- dall'alto al basso vediamo questi numeri 11010011 ma, come vi
dicevo, dobbiamo ribaltarli così avremo 11001011....esatto i numeri corrispondono!!!!
Ovviamente non andrete mai a convertire i numri a manualmente visto che anche la
calcolatrice di winzoz lo fa (dovete selezionare visualizza|scientifica) comunque un po'
di cultura non guasta mai ;)))
facciamo il resoconto di ciò che abbiamo appreso finora:
Scomposizione di un numero decimale e conversione da: Binario--->Decimale--->Binario
Affrontiamo ora il tipo di numerazione più importante cioè quello esadecimale, (o base
16) questo tipo di numerazione differisce dalla decimale perchè ci sono 16 numeri invece
che i soliti 0 1 2 3 4 5 6 7 8 9
e dalla binaria perchè ogni numero in base 16 equivale a 4 in base 2, siccome avrete le
idee confuse ecco una tabella riassuntiva (la metto in verticale altrimenti non entra nel
mio monitor da 14'')
- Decimale Binario
Esadecimale
- 0
0000
0
1
0001
1
2
0010
2
3
0011
3
4
0100
4
5
0101
5
6
0110
6
7
0111
7
8
1000
8
9
1001
9
10
1010
A
11
1011
B
12
1100
C
13
1101
D
14
1110
E
15
1111
F
- Come facciamo a convertire un numero binario in esadecimale e
viceversa? In base 16 le conversioni sono semplicissime dal momento che ogni numero
esadecimale equivale a 4 binari quindi supponiamo di avere 8F5DA come fà a diventare
binario? Eccovi un altro esempio:
- 8 = 1000
F = 1111
5 = 0101
D = 1101
A = 1010
- Possiamo dire che 8F5DA = 10001111010111011010.
Vogliamo fare la solita verifica per vedere se abbiamo fatto tutti i calcoli bene? Credo
di si, la domanda sorge ormai spontanea...come si fà? Si divide il numero binario in
gruppi di 4 cifre (a partire dalla meno significativa che è l'ultima, la più
significativa è la prima) e se vede man mano a cosa corrisponde:
1010
1101 0101 1111 1000
A D 5
F 8
facciamo un po' di "reversing" sul numero ottenuto ed otteniamo come sospettato
8F5DA.
Questo tipo di conversione "veloce" vale solo per il sistema
Base2->Base16->Base2
Per fare i calcoli da Base16 a Base10 e vice versa le operazioni sono le stesse che
abbiamo usato durante le conversioni Base2->Base10->Base2, ovviamente i sistemi di
numerazione sono infiniti, un sistema caduto ormai nell'oblio è stato quello in Base8
(ottale) ma possiamo convertire qualunque cosa in quelunque base, pensate che qualche
settimana fà ho fatto un CrackMe che calcolava il seriale da inserire in base 78, in
numerazioni di questo genere ci sono sicuramente tutte le lettere dell'alfabeto e vengono
usati anche simboletti sconosciuti alla razza umana, una cosa bella di questi sistemi è
che un numero come 1000000000000000000000000000000000000000 diventa cortissimo e magari
simile a questo: ~1«½¦© ;))))
Prima di concludere anche questo articolo vorrei dirvi che non ho parlato volutamente
della rappresentazione dei numeri negativi in base2 visto che utilizzano un particolare
metodo detto "complemento a 2" estremamente difficile, se mi verrà chiesto
scriverò un articolo anche su questo ma vi assicuro che verrebbe estremamente lungo, ma
lungo lungo lungo ;)))
Ora voi vi starete chiedendo "Ma che cazz ce ne frega di conoscere come contano i
calcolatori", in realtà l'argomento è importante dal momento che un compilatore un
linguaggio ad alto livello (quale può essere il c/c++ o il Pascal ecc...) una volta
compilato non fà altro che convertire tutto in Assembly che a sua volta converte tutto in
esadecimale e che il processore converte in linguaggio macchina cioè 10110101011 in
codice binario.
Ultima raccomandazione: se incontrate qualcosa del tipo 1512h e non sapete cosa cavolo sia
(base8, 18 o 48) dovrete guardare in fondo, vedete quell'h? Quella indica che il numero si
trova in base 16, eccovi l'ultima tabella:
- b = Binario
o = Ottale
d = Decimale
h = Esadecimale
- quindi se smanettate con l'Assembly e dovete andare all'offset
00018F5Ah non domandatevi "come kazz si fà ad avere un offset a 9 cifre" ma
ricordate che l'ultima lettera minuscola vi indica sempre la base.
Ora che siete dei matematici divertitevi (io odio la matematica) ;)))))
- Ciauzzzzzzzz Quequero
- http://quequero.cjb.net
e-mail: [email protected]