NUMERI NEGATIVI E COMPLEMENTO A DUE
sistema binario
Il complemento a due, o complemento alla base, è il metodo più diffuso per la rappresentazione dei numeri con segno in informatica. L’espressione complemento a due viene spesso usata impropriamente per indicare l’operazione di negazione (cambiamento di segno) nei computer che usano questo metodo. La sua enorme diffusione è data dal fatto che i circuiti di addizione e sottrazione non devono esaminare il segno di un numero rappresentato con questo sistema per determinare quale delle due operazioni sia necessaria, permettendo tecnologie più semplici e con maggiore precisione; si utilizza un solo circuito, il sommatore, sia per l’addizione che per la sottrazione. Col complemento a due, il bit più significativo del numero ha peso negativo o positivo; da questo deriva che tutti i numeri che cominciano con un “1” sono numeri binari negativi, mentre tutti i numeri che cominciano con uno “0” sono numeri binari positivi.
Un numero binario positivo si può rendere negativo invertendone i bit e sommando 1 al valore risultante. Ciò è matematicamente giustificabile se osserviamo come si comporta la somma di un numero binario e del suo inverso: il risultato è una sequenza , che in complemento a 2 rappresenta -1. In simboli:
Allo stesso modo si può ottenere il valore assoluto di un numero binario negativo, ossia prendendo il complementare (invertendo il valore dei singoli bit) e aggiungendo 1 al numero binario risultante. Un numero binario di n cifre può rappresentare con questo metodo i numeri compresi fra -2(n-1) e +2(n-1)-1. Ad esempio, un numero binario di 8 cifre può rappresentare i numeri compresi tra -128 e +127. Questo metodo consente di avere un’unica rappresentazione dello zero (quando tutti i bit sono zero, eliminando così la ridondanza dello zero che si verifica con la rappresentazione in modulo e segno), e di operare efficientemente addizione e sottrazione sempre avendo il primo bit a indicare il segno. Infatti se il bit più significativo (il primo) è uguale a 1, il numero in complemento a due sarà negativo, mentre se questo è uguale a zero il numero sarà positivo, ecco un esempio:
01101100 (108) 10010100 (-108)
CALCOLO DELL’OPPOSTO IN COMPLEMENTO A DUE
Per rappresentare l’opposto di un numero binario in complemento se ne invertono, o negano, i singoli bit: si applica cioè l’operazione logica NOT. Si aggiunge infine 1 al valore del numero trovato con questa operazione. Facciamo un esempio rappresentando il numero -8 con 8 bit in complemento a 2. Partiamo dalla rappresentazione in binario del numero 8:
0000 1000 (8)
La prima cifra è 0, quindi il numero è sicuramente positivo. Invertiamo i bit: 0 diventa 1, e 1 diventa 0:
1111 01111
A questo punto abbiamo ottenuto il complemento a uno del numero 8; per ottenere il complemento a due sommiamo 1 a questo numero:
1111 0111 + 0000 0001 = 1111 0110 (-8)
Il risultato è un numero binario con segno che rappresenta il numero negativo -8 secondo il complemento a due. Il primo bit, pari a 1, evidenzia che il numero è negativo.
Il complemento a due di un numero negativo ne restituisce il numero positivo pari al valore assoluto: invertendo i bit della rappresentazione del numero -8 (sopra) e sommando 1 otteniamo:
0000 1001 sommiamo 1
0000 1001 +1 = 0000 1000 (+8)
ADDIZIONE
Operare l’addizione di due interi rappresentati con questo metodo non richiede processi speciali se essi sono di segno opposto, e il segno viene determinato automaticamente. Facciamo un esempio addizionando 10 e -5:
OPERAZIONE: 10+(-5) = 5
|
|||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Questo processo gioca sulla lunghezza fissa di 8 bit della rappresentazione: viene ignorato un riporto di 1 che causerebbe un overflow, e rimane il risultato corretto dell’operazione (5).
SOTTRAZIONE
Facciamo un altro esempio con una sottrazione con risultato negativo: 15 − 35 = −20:
1 | 1 | 1 | 1 | 1 | RIPORTO | ||||
0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 15 | |
0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | -35 (cp2) | |
0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | RISULTATO | |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | -20 cp2(del risultato) |
C’è anche un modo più rapido per calcolare il complemento a due, in pratica si parte da destra e si scorrono i bit fino ad incontrare il primo 1 compreso e si invertono tutti gli altri.
I NUMERI FLOATING POINT
Supponiamo di voler trasformare il numero reale 315,226 nella corrispondente rappresentazione binaria. È molto importante scegliere quanti bit andranno a rappresentare la parte frazionaria 0,226. Supponiamo di voler usare 5 bit.
VEDIAMO I VARI STEP
- Primo step si trasforma la parte intera in binario.
(315)10 = (000100111011)2
- Secondo step nella conversione da un numero naturale nel corrispondente binario si procedeva facendo divisioni per due, se vi era un resto si rappresentava con un 1, in caso contrario con 0. Con i numeri reali si procede moltiplicando per due, se la parte intera del numero è più grande di 1 allora si prende la parte frazionaria.
0,226 | x | 2 | = | 0,452 | 0 | |
0,452 | x | 2 | = | 0,904 | 0 | |
0,904 | x | 2 | = | 1,808 | 1 | Si prende la parte frazionaria del numero |
0,808 | x | 2 | = | 1,616 | 1 | Si prende la parte frazionaria del numero |
0,616 | x | 2 | = | 1,232 | 1 | Si prende la parte frazionaria del numero |
(0,226)10 = (0,00111)2
- Terzo step si uniscono i risultati.
(315,226)10 = (000100111011)2 +(0,00111)2
Vediamo come avviene la conversione da binario a decimale di un numero reale.
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | -1 | -2 | -3 | -4 | -5 | |
1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | , | 0 | 0 | 1 | 1 | 1 |
1×28 + 1×25 + 1×24 + 1×23 + 1×21 + 1×20 + 0x2-1 + 0x2-2 + 1×2-3 + 1×2-4 + 1×2-5 =315,21875
Se vogliamo una maggior precisione aumentiamo i bit per la parte decimale.
STANDARD IEEE 754
Lo standard IEEE per il calcolo in virgola mobile (IEEE 754) (ufficialmente: IEEE Standard for Binary Floating-Point Arithmetic (ANSI/IEEE Std 754-1985) o anche IEC 60559:1989, Binary floating-point arithmetic for microprocessor systems) è lo standard più diffuso nel campo del calcolo automatico. Questo standard definisce il formato per la rappresentazione dei numeri in virgola mobile (compreso ±0 e i numeri denormalizzati; gli infiniti e i NaN, “not a number“), ed un set di operazioni effettuabili su questi. Specifica inoltre quattro metodi di arrotondamento e ne descrive cinque eccezioni. Esistono in questo standard quattro formati per i numeri in virgola mobile: a precisione singola (32 bit), precisione doppia (64 bit), precisione singola estesa (≥ 43 bit), raramente usato, e precisione doppia estesa (≥ 79 bit), supportata solitamente con 80 bit. La precisione singola è il minimo richiesto dallo standard, gli altri sono opzionali.
Fissa il formato per i numeri che usano 32 bit, 64 bit, 128 bit.
LA NOTAZIONE SCIENTIFICA
Consideriamo il numero 5000. Tale numero si può esprimere in una delle seguenti forme:
5×103 = 5 E +3 = 0,5 E +4 = 50000 E -1
Quella appena scritta rappresenta la notazione scientifica di un numero.
0,005 = 5 E -3 = 5 x 10-3
5 è la mantissa
E è la base
-3 è l’esponente
Cambiando il numero cambia la mantissa e l’esponente, quindi dobbiamo decidere quanti bit dare alla mantissa e quanti all’esponente.
VEDIAMO UN CASO DI APPLICAZIONE AD UN NUMERO BINARIO
1011,0011 = 10,110011 x 22 spostando la virgola di due posti verso sinistra equivale a moltiplicare il numero per 4.
101100,11 x 2-2 spostando la virgola di due posti verso destra equivale a dividere il numero per 4.
È stata stabilita nello standard IEEE 754 la seguente forma:
S 1,XXXXXXX…X2esponente (Notazione scientifica normalizzata perché ha solo 1 nella parte intera).
S=segno
X=0 oppure 1
Dobbiamo arrivare sempre a questa forma. Se ci pensiamo bene un 1 a sinistra lo troviamo sempre, perché se il numero binario inizia con 0 questi zeri li possiamo omettere.
0,00001011 = 1,011×2-5 Vediamo che è possibile arrivare sempre alla notazione scientifica normalizzata, ora non resta che decidere quanti bit mettere a disposizione per la mantissa e quanti per l’esponente.
SINGOLA PRECISIONE 32 BIT | ||
S | ESPONENTE | MANTISSA |
1 bit | 8 bit | 23 bit |
DOPPIA PRECISIONE 64 BIT | ||
S | ESPONENTE | MANTISSA |
1 bit | 11 bit | 52 bit |
PRECISIONE ESTESA 80 BIT | ||
S | ESPONENTE | MANTISSA |
1 bit | 15 bit | 64 bit |
RAPPRESENTAZIONE DELLA PARTE ESPONENZIALE
Vediamo ora come rappresentare la parte esponenziale, questa può essere positiva o negativa e sembrerebbe spontaneo usare il complemento a due, ma ciò porta ad un piccolo problema che si verifica quando dobbiamo comparare due numeri in virgola mobile.
NUMERO | ESPONENTE |
1.0×2-1 | 11111111 |
1.0×2+1 | 00000001 |
IL BIAS
Come si vede ½ è rappresentato da una cifra binaria molto alta (il complemento a due di +1 è 11111111) e 2 da una cifra binaria molto bassa (00000010), il che rende difficili i confronti in un elaboratore. La soluzione a questo problema è un bias. Vediamo in cosa consiste. Se il numero n1 è minore di n2 è vero che:
n1 + x < n2 + x
50 + 100 < 70 + 100 dove n1=50, n2 = 70
-50 +100 < 70 +100
Il bias nel caso di un byte è 127. È un po’ come se l’intervallo da -127 a + 127 sia stato spostato in avanti grazie al bias di 127 posizioni. Ti lascio un link a Wikipedia per approfondire l’argomento. https://it.wikipedia.org/wiki/IEEE_754
Vediamo un esempio.
VOGLIAMO SCRIVERE IL NUMERO 315,226 IN SINGOLA PRECISIONE
- Si trasforma il numero reale in un numero binario come visto precedentemente.
(315,226)10 = (100111011,00111)2
- Si scrive il numero trovato in notazione scientifica normalizzata.
1,0011101100111×2+8 il primo bit verrà sottointeso tanto è sempre a 1
- Si somma all’esponente il bias.
8+127 = 135
- Converto l’esponente in binario
(135)10 = (10000111)2
S | ESPONENTE | MANTISSA |
1 bit | 8 bit | 23 bit |
0 | 10000111 | 0011101100111000000000 |
Quindi il numero binario ottenuto mettendo in sequenza segno, esponente, mantissa sarà: 0100001110011101100111000000000
FACCIAMO UN ALTRO ESEMPIO
Per ottenere la rappresentazione floating point in precisione singola del numero decimale ‑109,78125 bisogna convertire in binario la parte intera e la parte decimale ottenendo:
1101101,11001
che in notazione normalizzata corrisponde a:
1,10110111001×26
All’esponente va aggiunto il valore del bias 127 e quindi l’esponente è costituito dal valore 133:
10000101
Poiché il numero è negativo il bit del segno va impostato a 1.
Si ottengono quindi i valori:
1 per il segno
10000101 per l’esponente
10110111001 completato con zeri per la mantissa (l’1 della parte intera è sottinteso)
e quindi la rappresentazione finale è
11000010110110111001000000000000
Ulteriori informazioni le trovate al link http://informatica.abaluth.com/il-computer/le-informazioni/rappresentazione-dei-numeri-reali-standard-ieee-754/
Questo invece è un link per vedere se i risultati ottenuti sono corretti: Convertitore
NUMERI NEL SISTEMA BINARIO – LINK AI PRECEDENTI POST
- INTRODUZIONE AL SISTEMA BINARIO
- LE OPERAZIONI NEL SISTEMA BINARIO
- LE GRANDEZZE BINARIE
- LA CODIFICA DEI CARATTERI
-
IMMAGINI VIDEO E SUONI
Link di approfondimento: https://www.youtube.com/watch?v=d0FBpKQK844&list=PL0qAPtx8YtJeGo5g4Esi7tm6kHPRivkvb&index=26
APPROFONDIMENTO AI
La rappresentazione binaria dei numeri negativi e dei numeri floating-point in informatica è realizzata attraverso tecniche specifiche che consentono di gestire efficacemente sia numeri con segno che numeri con virgola. Di seguito spiegherò brevemente entrambe le codifiche.
1. Codifica binaria dei numeri negativi
Per rappresentare i numeri negativi in binario, esistono diverse tecniche. Le più comuni sono:
1.1. Metodo del Complemento a 2
Il metodo del complemento a 2 è il più utilizzato nei sistemi informatici per rappresentare numeri interi negativi. Funziona in questo modo:
• Rappresentazione di numeri positivi: Un numero positivo viene rappresentato normalmente in binario. Ad esempio, +5 in binario a 4 bit è 0101.
• Rappresentazione di numeri negativi: Per ottenere il complemento a 2 di un numero negativo:
1. Si rappresenta il corrispondente numero positivo in binario.
2. Si inverte ogni bit (ottenendo il complemento a 1).
3. Si somma 1 al risultato.
Esempio per il numero -5 a 4 bit:
• +5 in binario è 0101.
• Invertendo i bit si ottiene 1010 (complemento a 1).
• Sommando 1, si ottiene 1011 (complemento a 2), che è la rappresentazione binaria di -5 .
Vantaggi del complemento a 2:
• Un solo modo di rappresentare lo zero.
• Le operazioni aritmetiche (addizione e sottrazione) funzionano naturalmente anche con numeri negativi.
1.2. Codifica con segno e modulo
In questo metodo, il primo bit rappresenta il segno (0 per positivo, 1 per negativo) e i restanti bit rappresentano il valore assoluto del numero. Per esempio, con 4 bit:
• +5 è rappresentato come 0101.
• -5 è rappresentato come 1101.
Questo metodo, tuttavia, ha lo svantaggio di avere due rappresentazioni per lo zero: 0000 e 1000.
Struttura Generale di un Numero Floating Point
I numeri floating point (o numeri in virgola mobile) sono un modo per rappresentare numeri reali in forma approssimata all’interno di un computer. La rappresentazione binaria di questi numeri segue standard specifici, tra cui il più comune è lo standard IEEE 754. Questa descrizione dettagliata illustrerà come i numeri floating point vengono codificati in binario, analizzando le varie componenti che costituiscono tale rappresentazione.
Un numero floating point è generalmente composto da tre parti:
1. Segno (S): indica se il numero è positivo o negativo.
2. Esponente (E): determina l’ordine di grandezza del numero.
3. Mantissa o Significand (M): rappresenta le cifre significative del numero.
La rappresentazione in binario di un numero floating point può essere espressa come:
Numero = (-1)S X M X 2(E – Bias)
Dove:
• S è il bit di segno (0 per positivo, 1 per negativo).
• M è la mantissa normalizzata (1.M per precisione normale).
• E è l’esponente codificato.
• Bias è un valore costante che dipende dal formato (ad esempio, 127 per single precision).
Formati Principali dello Standard IEEE 754
• Single Precision (32 bit):
• 1 bit per il segno.
• 8 bit per l’esponente.
• 23 bit per la mantissa.
• Double Precision (64 bit):
• 1 bit per il segno.
• 11 bit per l’esponente.
• 52 bit per la mantissa.
Dettagli delle Componenti
1. Bit di Segno (S):
• 0 indica un numero positivo.
• 1 indica un numero negativo.
2. Esponente (E):
• Codificato in forma di esponente con bias per permettere la rappresentazione di esponenti negativi.
• Il bias è calcolato come 2k-1 – 1 , dove k è il numero di bit dell’esponente.
• Ad esempio, per single precision con 8 bit di esponente: Bias = 127 .
3. Mantissa (M):
• Rappresenta la parte frazionaria del numero.
• Nei numeri normalizzati, il bit 1 alla sinistra della virgola binaria è implicito (non viene memorizzato).
• La mantissa effettiva è quindi 1 + Mantissa codificata.
Processo di Codifica di un Numero Decimale in Floating Point
Per codificare un numero decimale in formato floating point:
1. Convertire il numero in binario.
2. Normalizzare il numero binario in forma 1.M X 2E.
3. Calcolare l’esponente codificato aggiungendo il bias all’esponente reale.
4. Estrarre la mantissa codificata prendendo i bit significativi dopo la virgola.
5. Determinare il bit di segno.
Esempio Pratico: Codifica del Numero Decimale 10,625 in Single Precision
1. Conversione in binario:
• Parte intera (10):
• 10 / 2 = 5 resto 0
• 5 / 2 = 2 resto 1
• 2 / 2 = 1 resto 0
• 1 / 2 = 0 resto 1
• Parte intera in binario: 1010
• Parte frazionaria (0,625):
• 0,625 × 2 = 1,25 → bit 1
• 0,25 × 2 = 0,5 → bit 0
• 0,5 × 2 = 1,0 → bit 1
• Parte frazionaria in binario: .101
• Numero binario completo: 1010.101
2. Normalizzazione:
• Spostare la virgola dopo il primo 1:
• 1.010101 X 23
• Esponente reale E reale= 3
3. Calcolo dell’esponente codificato:
• E codificato = E reale + Bias = 3 + 127 = 130
• In binario: 130 → 10000010
4. Estrarre la mantissa codificata:
• Prendere i 23 bit dopo la virgola:
• Mantissa: 01010100000000000000000
5. Determinare il bit di segno:
• Il numero è positivo, quindi S = 0 .
6. Comporre il numero floating point:
• Bit di segno (1 bit): 0
• Esponente (8 bit): 10000010
• Mantissa (23 bit): 01010100000000000000000
• Numero finale in binario:
• 0 10000010 01010100000000000000000
Thank you for your sharing. I am worried that I lack creative ideas. It is your article that makes me full of hope. Thank you. But, I have a question, can you help me? https://accounts.binance.com/en/register?ref=V3MG69RO