Vai al contenuto

Fondamenti di informatica - Laurea triennale Informatica/Rappresentazione dei numeri interi

Wikibooks, manuali e libri di testo liberi.
Indice del libro

I computer devono rappresentare numeri interi usando un numero finito di bit. Questo rende la rappresentazione “compatibile” con i circuiti digitali, ma introduce anche limiti (per esempio l’overflow, cioè il “superamento” dell’intervallo rappresentabile).

Notazione in complemento a due

[modifica | modifica sorgente]

È il sistema più usato nei computer moderni (tipicamente con 32 bit, qui si usano esempi a 4 bit per semplicità).

Come sono distribuiti i valori

[modifica | modifica sorgente]
  • Ogni numero è rappresentato da un pattern di bit a lunghezza fissa.
  • Il bit più a sinistra indica il segno (sign bit):
    • 0 → valore non negativo (0 e positivi)
    • 1 → valore negativo
  • Con 4 bit, l’intervallo è da −8 a +7.

Relazione tra +x e −x

[modifica | modifica sorgente]

C’è una relazione pratica tra il pattern di un numero positivo e quello del corrispondente negativo:

  • letti da destra, sono uguali fino al primo 1 (incluso),
  • i bit rimanenti a sinistra sono complementati (0↔1).

Da qui deriva un metodo per ottenere il negativo di un numero (a parità di bit):

  1. copia i bit da destra fino a includere il primo 1,
  2. complementa tutti i bit rimanenti.

Decodifica (da bit a numero)

[modifica | modifica sorgente]
  • Se il sign bit è 0, si legge come normale binario.
  • Se il sign bit è 1, il valore è negativo: si applica la procedura “copia e complementa” per ricavare la magnitudine, poi si mette il segno meno.

Addizione in complemento a due

[modifica | modifica sorgente]

Per sommare numeri (anche con segno) si usa la stessa addizione binaria di sempre, con una regola:

  • tutti i risultati restano della stessa lunghezza (es. 4 bit),
  • l’eventuale riporto finale a sinistra viene scartato (troncato).

Vantaggio chiave: lo stesso circuito di addizione funziona per:

  • positivo + positivo
  • negativo + negativo
  • positivo + negativo

E anche la sottrazione si riconduce a un’addizione:

  • a−b=a+(−b) Quindi basta avere un circuito per negare (fare −b) e uno per addizionare.

Il problema dell’overflow

[modifica | modifica sorgente]

Con un numero fisso di bit, non tutti i valori sono rappresentabili.

  • Con 4 bit, 9 non è rappresentabile: operazioni che dovrebbero dare 9 produrranno un risultato “sbagliato” perché il sistema “gira” dentro l’intervallo.

Overflow = quando un calcolo produce un risultato fuori dall’intervallo rappresentabile.

Nel complemento a due, l’overflow si può rilevare così:

  • sommo due positivi e ottengo un risultato con segno negativo → overflow
  • sommo due negativi e ottengo un risultato con segno positivo → overflow

Excess notation

[modifica | modifica sorgente]

È un altro metodo per rappresentare interi con bit a lunghezza fissa.

Come si costruisce

[modifica | modifica sorgente]
  1. si elencano tutti i pattern di N bit in ordine binario,
  2. si sceglie come zero il pattern che sta circa a metà (il primo con MSB=1),
  3. i pattern successivi rappresentano 1,2,3,… e quelli precedenti rappresentano −1,−2,…

Con 4 bit, il sistema mostrato è chiamato excess 8:

  • perché, se interpreti il pattern come binario “normale”, ottieni un valore che è sempre maggiore di 8 rispetto al valore “reale” in eccesso.
    • Esempio: 1100 è 12 in binario, ma vale 4 in excess 8 (12 − 8 = 4)
    • 0000 è 0 in binario, ma vale −8 in excess 8 (0 − 8 = −8)

Differenza importante rispetto al complemento a due: il “bit di segno” risulta invertito rispetto all’intuizione del complemento a due (nella tabella mostrata, i valori negativi cadono nella metà con MSB=0).

Complemento a 2 (4 bit)

[modifica | modifica sorgente]

A) Bit → decimale

[modifica | modifica sorgente]

Regola rapida

  • Se il bit più a sinistra (MSB) è 0 → leggi come binario normale.
  • Se MSB è 1 → il numero è negativo:
    1. fai “copia fino al primo 1 da destra, poi complementa il resto” (equivalente a fare il complemento a 2),
    2. leggi il risultato come binario → quello è il valore assoluto, poi metti .

Esempi

  • 0110 → MSB=0 → binario normale = 6
  • 0101 → MSB=0 → = 5
  • 1111 → MSB=1 → negativo
    • “inverti e +1”: 1111 inverti → 0000, +1 → 0001 = 1 ⇒ −1
  • 1010 → MSB=1 → negativo
    • inverti: 0101, +1 → 0110 = 6 ⇒ −6
  • 1000 → MSB=1 → negativo
    • inverti: 0111, +1 → 1000 = 8 ⇒ −8 (è il più piccolo con 4 bit)

B) Decimale → bit

[modifica | modifica sorgente]

Regola rapida

  • Se il numero è ≥ 0: scrivi il binario su 4 bit.
  • Se è negativo:
    1. scrivi il valore assoluto in binario su 4 bit,
    2. inverti i bit,
    3. aggiungi 1.

Esempi

  • +6 → binario = 0110
  • +20010
  • −6
    • +6 = 0110
    • inverti → 1001
    • +1 → 1010−6 = 1010
  • −3
    • +3 = 0011
    • inverti → 1100
    • +1 → 1101−3 = 1101

Excess notation (Excess 8, 4 bit)

[modifica | modifica sorgente]

Qui con 4 bit l’offset è 8, quindi:

  • valore = (bit interpretato come binario) − 8
  • bit = (valore + 8) scritto in binario su 4 bit

A) Bit → decimale (excess 8)

[modifica | modifica sorgente]

Esempi

  • 1000 → binario 8 → 8 − 8 = 0
  • 1101 → binario 13 → 13 − 8 = 5
  • 0011 → binario 3 → 3 − 8 = −5
  • 0000 → binario 0 → 0 − 8 = −8
  • 1111 → binario 15 → 15 − 8 = 7

B) Decimale → bit (excess 8)

[modifica | modifica sorgente]

Esempi

  • 0 → 0 + 8 = 8 → 1000
  • +5 → 5 + 8 = 13 → 1101
  • −5 → −5 + 8 = 3 → 0011
  • +7 → 7 + 8 = 15 → 1111
  • −8 → −8 + 8 = 0 → 0000

Confronto lampo sullo stesso pattern (4 bit)

[modifica | modifica sorgente]
  • 1101
    • complemento a 2: MSB=1 → negativo → vale −3
    • excess 8: binario 13 → 13−8 = +5
  • I numeri reali (in senso matematico) sono infiniti, ma il computer usa rappresentazioni finite.
  • Gli interi hanno un minimo e massimo rappresentabile in base ai bit disponibili.
  • Le operazioni possono causare overflow, producendo risultati errati se non gestiti.
  • Il complemento a due è molto efficiente perché unifica addizione e sottrazione tramite la stessa logica hardware.
  • La notazione in eccesso rappresenta i numeri tramite uno shift (offset) costante.