Rappresentazione in complemento a 2

Un modo veloce per calcolare il complemento a 2 è trovare l'uno nella sequenza binaria ed invertire tutte le cifre successive: se ho 001, l'uno è il più a destra, e lo lascio invariato, da quel bit in poi inverto tutto: 001 -> complemento a 2-> 111.

Con questa codifica, i negativi sono rappresentati come il complemento a 2 dei numeri positivi.

Avendo tre bit:
000 = 0
Il suo complemento a 2 è: 111 + 1 = 1000, non considero l'overflow, quindi sempre 000.

001 = 1
Il suo complemento a 2 è: 110 + 1 = 111 quindi -1 = 111.

010 = 2
Il suo complemento a 2 è: 101 + 1 = 110 quindi -2 = 110.

011 = 3
Il suo complemento a 2 è: 100 + 1 = 101 quindi -3 = 101

Cosa sarà 100? Il bit più significativo è 1, potrebbe essere -0, tuttavia abbiamo visto che il complemento a 2 di 000 è sempre 000. Per cui 100 è -4.

Cosa è cambiato rispetto alla codifica con complemento a 2:

  • l'uso di un bit per il segno ci consente di rappresentare sempre cifre. Con il modulo-segno e il complemento a 1 il range minimo-massimo era: . Adesso lo 0 non ha più due rappresentazioni, ma solo una. Quindi il range diventa .-
  • una gruppo di bit viene usato per la rappresentazione di un valore non sensato: -0.
  • non è possibile effettuare la somma con algoritmo tradizionale.

Proprietà:

  • 0 è 00...00
  • -1 è 11...11
  • Il massimo positivo è 011..11
  • Il massimo negativo è 100..00

NOTA: avendo a disposizione k bit con codifica che sfrutta il complemento a 2, se il bit di segno è uguale a 0, non serve effettuare il complemento a 2 per vedere quale numero rappresenta. Solo se il numero è negativo (bit significativo a 1) occorre effettuare una operazione di complemento a due per vedere a quale numero si riferisce in modulo.

Criteri per trovare l'occorrenza di un overflow

  • ci sono addendi dello stesso segno e il segno del risultato è diverso da quello dei due addendi (1 +1 avrà come risultato un numero con segno positivo, non è possibile che restituisce un negativo).

  • oppure, si possono guardare le ultime due colonne (colonne più a sinistra) nell'operazione in colonna, e controllare i riporti. Se i riporti delle due colonne sono discordi si è verificato un overflow. Esempio:
    1011
    1101
    11000
    La penultima colonna scrive 0 riportando 1
    Mentre l'ultima scrive 1 riportando 1
    Riporti discordi: overflow.

    Esempio opposto:
    1101
    0010
    1111
    La penultima colonna scrive 1 riportando 0
    L'ultima scrive 1 riportando 0
    Riporti concordi: nessun overflow.