Salta ai contenuti

Conversioni numeriche

I computer e tutti i moderni dispositivi digitali operano internamente manipolando stati fisici discreti: presenza o assenza di tensione elettrica, magnetizzazione positiva o negativa, passaggio o blocco di luce. Questa natura fisica binaria fa sì che l’unità fondamentale di informazione sia il bit (binary digit), che può assumere solo i due valori 00 e 11.

Comprendere come i numeri e i dati vengano codificati e trasformati tra le diverse basi è uno dei primi e più importanti passi nello studio dell’informatica.

┌────────────────────────┐
│ SISTEMA DECIMALE │ <─── Utilizzato dagli esseri umani (Base 10)
└───────────┬────────────┘
┌─────────────┴─────────────┐
│ │
▼ ▼
┌────────────────────────┐ ┌────────────────────────┐
│ SISTEMA BINARIO │ │ SISTEMA ESADECIMALE │
│ Linguaggio macchina │ │ Rappresentazione │
│ (Base 2) │ │ compatta (Base 16) │
└────────────────────────┘ └────────────────────────┘

Perché questo argomento è fondamentale?

Lo studio delle conversioni numeriche non è un mero esercizio algebrico, ma la chiave per comprendere gli argomenti cardine dei capitoli successivi del manuale:

  • Architettura dei Calcolatori: I registri del processore (CPU), l’unità aritmetico-logica (ALU), i bus di comunicazione e l’indirizzamento della memoria RAM operano a livello di parole binarie (a 32 o 64 bit).
  • Sistemi Operativi: Gli indirizzi di memoria fisica e virtuale, i puntatori e i permessi dei file (come la celebre notazione ottale chmod 755 nei sistemi Linux/Unix) sono costantemente espressi in esadecimale o in ottale per comodità di lettura.
  • Reti di Calcolatori: Gli indirizzi IPv4 sono costituiti da 32 bit suddivisi in 4 byte decimali (e il calcolo delle maschere di sottorete, o subnetting, richiede continue conversioni tra binario e decimale); gli indirizzi fisici MAC e gli indirizzi IPv6 sono invece interamente codificati in notazione esadecimale.

1. Come contiamo noi: il Sistema Posizionale in Base 10

Fin da piccoli siamo abituati a contare in base 10 (molto probabilmente perché abbiamo dieci dita sulle mani!). In base 10 abbiamo a disposizione dieci cifre diverse: da 00 a 99.

Ma cosa significa davvero un numero come 743743?

Fin dalle scuole elementari abbiamo imparato a scomporlo in colonne:

  • 33 unità (vale 3×1=33 \times 1 = 3)
  • 44 decine (vale 4×10=404 \times 10 = 40)
  • 77 centinaia (vale 7×100=7007 \times 100 = 700)

743=700+40+3=(7×100)+(4×10)+(3×1)743 = 700 + 40 + 3 = (7 \times 100) + (4 \times 10) + (3 \times 1)

Questo modo di rappresentare i numeri si chiama sistema posizionale: il valore reale di una cifra non dipende solo dal suo disegno, ma dalla posizione in cui si trova all’interno del numero.
Un 77 all’inizio vale 700700, ma se lo spostiamo all’ultimo posto vale soltanto 77!

Se osserviamo con attenzione, ogni colonna (partendo da destra e andando verso sinistra) vale 10 volte di più rispetto a quella precedente:

  • Colonna 0 (unità): 1=1001 = 10^0
  • Colonna 1 (decine): 10=10110 = 10^1
  • Colonna 2 (centinaia): 100=102100 = 10^2
  • Colonna 3 (migliaia): 1000=1031000 = 10^3

743=7102+4101+3100743 = 7 \cdot 10^2 + 4 \cdot 10^1 + 3 \cdot 10^0


2. E se cambiassimo base? Il Sistema Binario (Base 2)

I computer non hanno dieci dita: all’interno dei processori e delle memorie ci sono miliardi di microscopici interruttori elettronici (i transistor) che possono trovarsi solo in due stati fisici possibili: spento (00) o acceso (11).

Per questo motivo il computer usa la base 2 (sistema binario), in cui abbiamo a disposizione solo due cifre: 00 e 11. Ogni singola cifra binaria si chiama bit (binary digit).

La regola posizionale è la stessa identica del sistema decimale, solo che ogni colonna (da destra verso sinistra), invece di moltiplicarsi per 10, si moltiplica per 2 (raddoppia):

Colonna7766554433221100
Potenza di 2272^7262^6252^5242^4232^3222^2212^1202^0
Valore della colonna12812864643232161688442211

3. Parte I: Numeri Interi (Senza Virgola)

Vediamo ora passo dopo passo come convertire i numeri interi positivi da una base all’altra.

3.1. Conversioni tra Binario (Base 2) e Decimale (Base 10)

Da Binario a Decimale: “Accendere o spegnere i pesi”

Per convertire un numero binario in decimale basta guardare le colonne:

  1. Scrivi il valore di ogni colonna (partendo da destra: 1,2,4,8,16,32,64,1281, 2, 4, 8, 16, 32, 64, 128 \dots).
  2. Prendi solo i valori delle colonne dove c’è il bit 11 (“acceso”) e sommali tra loro. I bit 00 (“spento”) si ignorano.

Da Decimale a Binario (Metodo 1: Divisioni Successive)

Per convertire un numero intero da decimale a binario:

  1. Si divide il numero decimale per 22.
  2. Si annota il resto (che sarà sempre 00 o 11).
  3. Si divide il quoziente ottenuto nuovamente per 22.
  4. Si prosegue fino a quando il quoziente diventa 00.
  5. Si leggono i resti in ordine inverso (dall’ultimo ottenuto al primo, cioè dal basso verso l’alto).

Da Decimale a Binario (Metodo 2: Metodo Intuitivo per Sottrazione di Potenze)

Per numeri non eccessivamente grandi (fino a qualche centinaio), esiste un metodo molto più rapido che si può svolgere in gran parte a mente.

Si basa su una semplice domanda: «Qual è la potenza di 2 più grande contenuta nel mio numero?».

Come procedere:

  1. Trova la potenza di 2 più alta che sia minore o uguale al numero di partenza.
  2. Scrivi 11 come prima cifra e calcola quanto rimane sottraendo quella potenza.
  3. Passa in rassegna in ordine decrescente tutte le potenze successive fino a 20=12^0 = 1:
    • Se la potenza considerata ci sta nel valore rimasto: scrivi 11 e sottrai il suo valore dal totale rimanente.
    • Se la potenza non ci sta (è più grande di quanto rimasto): scrivi 00 e mantieni inalterato il valore rimanente.
  4. Le cifre si leggono direttamente in ordine naturale, dall’alto verso il basso (da sinistra a destra).

3.2. Conversioni tra Esadecimale (Base 16) e Decimale (Base 10)

Il sistema esadecimale (base 16) necessita di 16 simboli. Poiché le cifre arabe arrivano solo a 9, si utilizzano le prime 6 lettere dell’alfabeto latino:

Simbolo00112233445566778899A\text{A}B\text{B}C\text{C}D\text{D}E\text{E}F\text{F}
Valore decimale00112233445566778899101011111212131314141515

Da Esadecimale a Decimale (Metodo delle potenze di 16)

In base 16, ogni colonna vale 16 volte più di quella alla sua destra (1,16,256,40961, 16, 256, 4096 \dots).
Basta moltiplicare ciascuna cifra per il valore della sua colonna (ricordando di convertire le lettere nei loro valori da 10 a 15).

Da Decimale a Esadecimale (Divisioni Successive per 16)

Si divide ripetutamente per 16, registrando i resti (convertendo i resti da 10 a 15 nelle corrispondenti lettere A-F) e leggendoli dal basso verso l’alto.


3.3. Conversioni tra Basi Generiche Qualsiasi (Metodo del Ponte in Base 10)

Quando dobbiamo convertire un numero tra due basi generiche qualsiasi (ad esempio da base 5 a base 7), il metodo universale è utilizzare la nostra cara Base 10 come “ponte”.

Poiché siamo abituati a eseguire tutte le operazioni aritmetiche (somme, moltiplicazioni e divisioni) in base 10, passare per il sistema decimale è il procedimento standard per collegare due basi arbitrarie:

┌─────────────┐ Passo 1 ┌──────────────┐
│ Base b1 │ ──────────────────────────────────────> │ Base 10 │
└─────────────┘ (somma pesi delle colonne) └──────┬───────┘
│ Passo 2 (divisioni per b2)
┌──────────────┐
│ Base b2 │
└──────────────┘

3.4. Conversioni Dirette tra Basi Potenze di 2

Esiste un “trucco” fantastico quando una base è una potenza esatta di 2:

  • Base 16 (16=2416 = 2^4): ogni cifra esadecimale equivale esattamente a un gruppetto di 4 bit!
  • Base 8 (8=238 = 2^3): ogni cifra ottale equivale esattamente a un gruppetto di 3 bit!

Non serve fare alcuna moltiplicazione o divisione: basta sostituire direttamente le cifre con i loro blocchi di bit.

Tabella di Corrispondenza Rapida

EsadecimaleBinario (4 bit)DecimaleOttaleBinario (3 bit)
0000000000
1000111001
2001022010
3001133011
4010044100
5010155101
6011066110
7011177111
810008--
910019--
A101010--
B101111--
C110012--
D110113--
E111014--
F111115--

Da Binario a Esadecimale (Diretto)

  1. Raggruppa i bit in gruppi di 4 partendo da destra.
  2. Se all’ultimo gruppo a sinistra mancano dei bit, aggiungi degli zeri davanti.
  3. Sostituisci ogni gruppo con la cifra esadecimale corrispondente.

Da Esadecimale a Binario (Diretto)

Sostituisci ogni cifra esadecimale con il suo blocco di 4 bit precisi (scrivendo anche gli eventuali zeri all’inizio del quartetto!).

Ponte Rapido Esadecimale - Ottale (passando per il Binario)

Per convertire tra base 16 e base 8 non serve passare per la base 10: usiamo il binario come scorciatoia!

┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Esadecimale │ ──(spacchetta a 4 bit)───> │ Binario │ ────(raggruppa a 3 bit)──> │ Ottale │
└──────────────┘ └──────────────┘ └──────────────┘

4. Parte II: Numeri con la Virgola (Frazionari)

Cosa succede alle cifre poste dopo la virgola?

Nel sistema decimale siamo abituati a:

  • 1ª cifra dopo la virgola: decimi (110=0.1\frac{1}{10} = 0.1)
  • 2ª cifra dopo la virgola: centesimi (1100=0.01\frac{1}{100} = 0.01)
  • 3ª cifra dopo la virgola: millesimi (11000=0.001\frac{1}{1000} = 0.001)

Nel sistema binario accade la stessa identica cosa, ma dimezzando ogni volta il valore (dividendo per 2):

Colonna dopo la virgola1a1^{\text{a}} (212^{-1})2a2^{\text{a}} (222^{-2})3a3^{\text{a}} (232^{-3})4a4^{\text{a}} (242^{-4})
Frazione12\frac{1}{2}14\frac{1}{4}18\frac{1}{8}116\frac{1}{16}
Valore decimale0.50.50.250.250.1250.1250.06250.0625

4.1. Da Binario a Decimale con la Virgola

Basta sommare i valori delle colonne accese (bit 11), sia per la parte intera che per la parte decimale.

4.2. Da Decimale a Binario con la Virgola (Moltiplicazioni Successive)

Per convertire la parte frazionaria di un numero decimale in binario:

  1. Si separa la parte intera dalla parte frazionaria.
  2. La parte intera si converte con le solite divisioni per 2.
  3. La parte frazionaria (dopo lo 0.0.) si converte mediante moltiplicazioni successive per 2:
    • Moltiplica la frazione per 22.
    • La parte intera del risultato (00 o 11) è la nuova cifra binaria dopo la virgola.
    • Prendi la nuova parte decimale rimanente e moltiplica ancora per 2.
    • Fermati quando la frazione diventa 00 (numero finito) o quando individui un periodo.
  4. Le cifre binarie dopo la virgola si leggono dall’alto verso il basso.

I Numeri Periodici nel Passaggio di Base: il caso di 0.1

Un numero che possiede una rappresentazione finita in decimale (come 0.1=1100.1 = \frac{1}{10}) può diventare periodico infinito quando viene convertito in binario!

Come si identifica il periodo?

Regola fondamentale: Le moltiplicazioni si interrompono non appena la parte decimale ottenuta ricompare identica a una già calcolata in un passaggio precedente. Da quel momento in poi, infatti, l’algoritmo non farebbe altro che ripetere all’infinito la stessa sequenza di calcoli.

Proviamo ad applicare le moltiplicazioni successive per 2 al numero 0.1100.1_{10}:

PassoMoltiplicazioneRisultatoCifra BinariaAnalisi del Periodo
10.1×20.1 \times 20.2\mathbf{0}.20Antiperiodo (1ª cifra dopo la virgola)
20.2×2\mathbf{0.2} \times 20.4\mathbf{0}.40🟡 Inizio del periodo: entra la frazione 0.20.2
30.4×20.4 \times 20.8\mathbf{0}.802ª cifra del periodo
40.8×20.8 \times 21.6\mathbf{1}.613ª cifra del periodo
50.6×20.6 \times 21.2\mathbf{1}.\mathbf{2}14ª cifra del periodo \to avanza di nuovo la frazione 0.2\mathbf{0.2}!
60.2×2\mathbf{0.2} \times 20.4\mathbf{0}.40🛑 STOP: abbiamo ritrovato 0.20.2 (già calcolato al Passo 2).

Poiché il ciclo si ripete a partire dal Passo 2, le quattro cifre binarie ottenute nei passi 2, 3, 4 e 5 formano il periodo 0011:

0.110=(0.00011)2=0.0001100110011001120.1_{10} = (0.0\overline{0011})_2 = 0.00011001100110011\dots_2


4.3. Conversioni Dirette con la Virgola (Binario ed Esadecimale)

Quando si convertono numeri con la virgola tra binario ed esadecimale (o ottale), la regola è:

  • Per la parte intera: si raggruppa a blocchi di 4 da destra verso sinistra (\leftarrow).
  • Per la parte decimale: si raggruppa a blocchi di 4 da sinistra verso destra (\rightarrow), aggiungendo zeri a destra se l’ultimo quartetto è incompleto.

5. Parte III: Rappresentazione dei Numeri Interi Negativi

Nei circuiti di un computer non esiste il segno "-": le celle di memoria possono contenere soltanto 00 e 11. Inoltre, a livello hardware lavoriamo sempre con registri a dimensione fissa (solitamente a 8 bit, 16 bit, 32 bit o 64 bit).

Vediamo come si possono rappresentare i numeri positivi e negativi (interi con segno).


5.1. Metodo 1: Modulo e Segno (Sign and Magnitude)

È l’approccio più intuitivo:

  • Il bit più a sinistra (chiamato MSB, Most Significant Bit) funge da bit di segno:
    • 0 indica numero positivo (++)
    • 1 indica numero negativo (-)
  • I rimanenti n1n-1 bit codificano il valore assoluto (modulo) del numero in binario naturale.

Perché il Modulo e Segno NON viene usato nei calcolatori moderni?

  1. Problema del Doppio Zero: esistono due rappresentazioni distinte per lo zero:
    +0=000000002+0 = 00000000_2 e 0=100000002-0 = 10000000_2. Questo spreca una configurazione e complica la logica di confronto.
  2. Circuiti aritmetici complessi: per sommare due numeri, la CPU non può semplicemente sommare i bit, ma deve verificare prima i segni, decidere se fare una somma o una sottrazione, e gestire quale dei due operandi abbia valore assoluto maggiore.

5.2. Metodo 2: Complemento a 1 (Cenno)

Nel complemento a 1:

  • I numeri positivi iniziano per 0 e sono codificati normalmente.
  • Un numero negativo si ottiene invertendo tutti i bit del corrispondente numero positivo (010 \to 1 e 101 \to 0).

Esempio a 8 bit: +5=000001012    5=111110102+5 = 00000101_2 \implies -5 = 11111010_2.

Anche il complemento a 1 soffre del problema del doppio zero (+0=000000002+0 = 00000000_2 e 0=111111112-0 = 11111111_2) e richiede la gestione di un riporto circolare durante l’addizione.


5.3. Metodo 3: Complemento a 2 (Standard Universale)

Il Complemento a 2 (Two’s Complement) è la convenzione universale adottata da tutti i processori moderni per rappresentare gli interi con segno.

Come calcolare il Complemento a 2 di un numero negativo:

Data la rappresentazione a nn bit del numero positivo:

  1. Inverti tutti i bit (calcola il complemento a 1: 010 \to 1 e 101 \to 0).
  2. Somma 11 al risultato.

Regola: C2(x)=x+1\text{Regola: } \quad C_2(x) = \overline{x} + 1

Scorciatoia Pratica: Il Metodo “Da Destra a Sinistra”

Per calcolare il complemento a 2 di un numero negativo senza dover eseguire l’inversione e la successiva addizione +1+1 in colonna, esiste una regola visiva immediata:

Regola:

  1. Prendi il numero positivo binario e leggilo partendo da destra verso sinistra (\leftarrow).
  2. Ricopia identici tutti gli eventuali zeri e il primo bit 1 che incontri.
  3. Da quel punto in poi, procedendo sempre verso sinistra, inverti tutti i bit rimanenti (010 \to 1 e 101 \to 0).

5.4. Proprietà Straordinarie del Complemento a 2

1. Il Peso del Bit di Segno (Lettura Diretta del Valore)

Normalmente, per scoprire quale numero decimale negativo corrisponde a una sequenza binaria in complemento a 2 (ad esempio 11010101), bisognerebbe eseguire un lungo procedimento inverso: ri-applicare il complemento a due (invertire i bit e sommare 11 per trovare il modulo positivo), calcolare il valore decimale e infine rimettere il segno "-".

Esiste però una proprietà straordinaria che ci risparmia completamente di dover riconvertire il numero: la consueta formula della notazione posizionale rimane valida per calcolare il valore all’istante, con un’unica fondamentale regola:

Il bit più a sinistra (bn1b_{n-1}, il bit di segno) ha un peso NEGATIVO pari a 2n1-2^{n-1}, mentre tutti gli altri bit conservano i consueti pesi positivi.

V=bn12n1+k=0n2bk2kV = -b_{n-1} \cdot 2^{n-1} + \sum_{k=0}^{n-2} b_k \cdot 2^k

2. Intervallo di Rappresentazione (Range) con nn bit

Con nn bit in complemento a 2:

  • Lo zero è univoco: 000000002=000000000_2 = 0.
  • L’intervallo di valori rappresentabili va da 2n1-2^{n-1} a +2n11+2^{n-1} - 1.
Dimensione (nn bit)Tipo comune in C/C++Valore MinimoValore Massimo
8 bit (1 byte)int8_t / signed char27=128-2^7 = \mathbf{-128}+271=+127+2^7 - 1 = \mathbf{+127}
16 bit (2 byte)int16_t / short215=32.768-2^{15} = \mathbf{-32.768}+2151=+32.767+2^{15} - 1 = \mathbf{+32.767}
32 bit (4 byte)int32_t / int2312.147.483.648-2^{31} \approx \mathbf{-2.147.483.648}+2311+2.147.483.647+2^{31} - 1 \approx \mathbf{+2.147.483.647}
64 bit (8 byte)int64_t / long long2639.22×1018-2^{63} \approx -9.22 \times 10^{18}+2631+9.22×1018+2^{63} - 1 \approx +9.22 \times 10^{18}

(Nota: c’è esattamente un numero negativo in più rispetto ai positivi, poiché lo 0 occupa una combinazione tra i numeri con bit di segno positivo).

3. La Sottrazione diventa una Semplice Addizione!

Questo è il motivo per cui l’intera industria informatica adotta il complemento a 2:
Per eseguire ABA - B, la CPU esegue semplicemente la somma tra AA e il complemento a 2 di BB:

AB=A+(B)A - B = A + (-B)

Non serve costruire un circuito hardware per la sottrazione: il sommatore binario della CPU gestisce somme e sottrazioni con la stessa identica operazione! L’eventuale riporto (carry) che fuoriesce dall’ultimo bit (nn-esimo) viene semplicemente ignorato.

Il Concetto di Overflow

L’overflow (o traboccamento) si verifica quando il risultato di un’operazione tra interi con segno eccede l’intervallo di valori rappresentabili nel registro (ad esempio tra 128-128 e +127+127 su 8 bit).

La regola per rilevare l’overflow è immediata:

  • Overflow Positivo: Somma di due numeri positivi che produce un risultato con bit di segno 1 (negativo).
  • Overflow Negativo: Somma di due numeri negativi che produce un risultato con bit di segno 0 (positivo).
  • (Nota: la somma di due numeri di segno opposto non può mai generare overflow, poiché il risultato si avvicina sempre allo zero).

Esempi Pratici di Overflow su 8 bit (Range: da -128 a +127)

1. Esempio di Overflow Positivo (+70 + +80 = +150):
Il valore teorico +150+150 supera il limite massimo rappresentabile (+127+127):

01000110 (+70) +
01010000 (+80) =
──────────
10010110 (Bit di segno 1: la CPU legge -106!)

Sommando due numeri positivi la CPU ottiene un numero con bit di segno 1, producendo l’assurdo risultato 10610-106_{10} anziché +150+150!


2. Esempio di Overflow Negativo (-70 + -80 = -150):
Il valore teorico 150-150 scende al di sotto del valore minimo rappresentabile (128-128):

10111010 (-70) +
10110000 (-80) =
──────────
(1)01101010 (Bit di segno 0: la CPU legge +106!)

Sommando due numeri negativi, scartando il nono bit di riporto, la CPU ottiene un numero a 8 bit che inizia con 0, producendo +10610+106_{10} anziché 150-150!


6. Mappa di Riepilogo delle Conversioni

Da \to AMetodo di CalcoloEsempio Chiave
Base bb \to DecimaleForma Polinomiale: somma delle cifre moltiplicate per le potenze positive e negative della base bb.(1101)2=18+14+02+11=1310(1101)_2 = 1\cdot 8 + 1\cdot 4 + 0\cdot 2 + 1\cdot 1 = 13_{10}
Decimale \to Base bb (Interi)Divisioni successive per bb: raccogliere i resti dal basso verso l’alto (dall’ultimo al primo).13:2=6 (r 1),    1101213 : 2 = 6 \text{ (r 1)}, \dots \implies 1101_2
Decimale \to Base bb (Frazionari)Moltiplicazioni successive per bb: raccogliere le parti intere dall’alto verso il basso.0.6252=1.25    0.10120.625 \cdot 2 = 1.25 \dots \implies 0.101_2
Base b1b_1 \to Base b2b_2 (Generiche)Ponte in Base 10: prima b110b_1 \to 10 con il metodo polinomiale, poi 10b210 \to b_2 con le divisioni successive.(32)51710(21)8(32)_5 \to 17_{10} \to (21)_8
Binario \to EsadecimaleRaggruppamento a 4 bit (nibble): da destra a sinistra per gli interi, da sinistra a destra per i decimali.101101112(B7)1610110111_2 \to (\text{B7})_{16}
Esadecimale \to BinarioEspansione diretta a 4 bit: sostituire ogni cifra con il suo quartetto binario corrispondente.(A3)161010 00112(\text{A3})_{16} \to 1010\ 0011_2
Intero Negativo \to Compl. a 2Inversione bit + 1: oppure copiare invariato fino al primo ‘1’ da destra e poi invertire tutto a sinistra.510da 00000101111110112-5_{10} \to \text{da } 00000101 \to 11111011_2

7. Mettiti alla Prova: Esercizi ed Esercitazioni Pratiche

Per consolidare tutti i concetti appresi e verificare la tua preparazione:

👉 Vai alla raccolta completa degli Esercizi sulle Conversioni Numeriche

Troverai tantissimi esercizi guidati suddivisi in 3 tipologie (Interi Positivi, Numeri con la Virgola, Interi con Segno in Complemento a 2) con soluzioni espandibili a scomparsa e passaggi dettagliati.

Puoi inoltre generare infiniti nuovi esercizi e verificare tutti i passaggi matematici in tempo reale con lo Strumento Interattivo per le Conversioni Numeriche.