Rappresentazione numeri negativi in informatica
Posto nella sezione secondaria di secondo grado in quanto sto studiando informatica da un libro delle superiori. Comunque, se ho sbagliato, vi chiedo scusa e spostate pure il thread nella sezione più adatta.
Vorrei rappresentare $(-14)_10$ in binario. Poiché il numero è negativo, sul bit di segno scrivo $1$ e sugli altri la conversione binaria del modulo complemento a 2.
$(14)_10 = (1110)_2$
Calcolo il complemento a 2 di $14$: $(1110)_2 => (0010)_2$.
Infine, aggiungo il bit di segno "1" per poter rappresentare il numero negativo: $(0010)_2 => (1-0010)_2$. Quindi, $(1-0010)_2$ dovrebbe rappresentare $-14$. (scrivo "-" solo per dstinguere il bit di segno dagli altri, altrimenti la notazione è ambigua).
Il problema è che il mio libro rappresenta il numero $14$ con 6 bit (5 per il modulo del numero e l'ultimo per il bit di segno, presumo): $(14)_10 = (0-01110)_2$. Ora, gli zeri alla sinistra del numero non sono significativi, ma quando si fa il complemento a 2 lo diventano, in quanto gli zeri si invertono con 1 e viceversa. Quindi, perché il mio libro rappresenta $14$ con 6 bit quando a me verrebbe normale rappresentarlo con 4 (5 se includo il bit di segno)?
Scusate il dubbio banale, ma studio da autodidatta e non saprei a chi altro chiedere.
Vorrei rappresentare $(-14)_10$ in binario. Poiché il numero è negativo, sul bit di segno scrivo $1$ e sugli altri la conversione binaria del modulo complemento a 2.
$(14)_10 = (1110)_2$
Calcolo il complemento a 2 di $14$: $(1110)_2 => (0010)_2$.
Infine, aggiungo il bit di segno "1" per poter rappresentare il numero negativo: $(0010)_2 => (1-0010)_2$. Quindi, $(1-0010)_2$ dovrebbe rappresentare $-14$. (scrivo "-" solo per dstinguere il bit di segno dagli altri, altrimenti la notazione è ambigua).
Il problema è che il mio libro rappresenta il numero $14$ con 6 bit (5 per il modulo del numero e l'ultimo per il bit di segno, presumo): $(14)_10 = (0-01110)_2$. Ora, gli zeri alla sinistra del numero non sono significativi, ma quando si fa il complemento a 2 lo diventano, in quanto gli zeri si invertono con 1 e viceversa. Quindi, perché il mio libro rappresenta $14$ con 6 bit quando a me verrebbe normale rappresentarlo con 4 (5 se includo il bit di segno)?
Scusate il dubbio banale, ma studio da autodidatta e non saprei a chi altro chiedere.
Risposte
In complemento a due, dove 0 è rappresentato univocamente, se si utilizzano 5 bit:
e se si utilizzano 6 bit:
Insomma, di bit ne bastano 5. Se, per un qualche motivo, se ne devono utilzzare 6, basta prenderne atto. Ad ogni modo, non so come il tuo libro determini il complemento a due. Tipicamente, utilizzando n bit:
e il valore del bit all'estrema siinistra (se 0 il numero è positivo, se 1 il numero è negativo) identifica il segno.
$-16 lt= (x)_10 lt= 15$
$(-14)_10=(10010)_2$
e se si utilizzano 6 bit:
$-32 lt= (x)_10 lt= 31$
$(-14)_10=(110010)_2$
Insomma, di bit ne bastano 5. Se, per un qualche motivo, se ne devono utilzzare 6, basta prenderne atto. Ad ogni modo, non so come il tuo libro determini il complemento a due. Tipicamente, utilizzando n bit:
$-2^(n-1) lt= (x)_10 lt= 2^(n-1)-1$
e il valore del bit all'estrema siinistra (se 0 il numero è positivo, se 1 il numero è negativo) identifica il segno.
"Noodles":
In complemento a due, dove 0 è rappresentato univocamente, se si utilizzano 5 bit:
$-16 lt= (x)_10 lt= 15$
$(-14)_10=(10010)_2$
e se si utilizzano 6 bit:
$-32 lt= (x)_10 lt= 31$
$(-14)_10=(110010)_2$
Ma questa notazione: $(-14)_10 = (10010)_2$ non è ambigua? $(10010)_2$ sta anche per $(17)_10$.
"Noodles":
di bit ne bastano 5. Se, per un qualche motivo, se ne devono utilzzare 6, basta prenderne atto. Ad ogni modo, non so come il tuo libro determini il complemento a due. Tipicamente, utilizzando n bit:
$-2^(n-1) lt= (x)_10 lt= 2^(n-1)-1$
e il valore del bit all'estrema siinistra (se 0 il numero è positivo, se 1 il numero è negativo) identifica il segno.
Il mio libro non definisce il complemento a due, c'è solo scritto come determinarlo:
1) Si effettua il complemento a 1 del numero stesso, che consiste nel cambiare gli 0 in 1 e viceversa, quindi si somma il valore 1 al complemento a 1;
2) oppure si parte dal bit meno significativo, si lasciano invariati tutti i bit fino al primo 1 (compreso), quindi si cambiano i bit rimanenti.
Dopo aver dato queste regole operative, fa l'esempio di $(-14)_10$ per convertirlo in base 2
Se il primo bit è il segno, non puoi scrivere $(17)_{10)$ in 5 bit quindi no, la notazione non è ambigua.
Comunque è il contesto che chiarisce tutto, cioè se ci si riferisce a un numero con un bit di segno o semplicemente un numero binario. Immagino non sarà un problema capirlo.
"HowardRoark":
Quindi, perché il mio libro rappresenta $14$ con 6 bit quando a me verrebbe normale rappresentarlo con 4 (5 se includo il bit di segno)?
Scusate il dubbio banale, ma studio da autodidatta e non saprei a chi altro chiedere.
Magari perché qualcuno vuole _poter_ scrivere numeri più grandi ma in questo momento ha bisogno di scrivere il numero 14. In molti linguaggi di programmazione magari puoi scegliere fra 8, 16, 32 e 64 bit.
"ghira":
Magari perché qualcuno vuole _poter_ scrivere numeri più grandi ma in questo momento ha bisogno di scrivere il numero 14. In molti linguaggi di programmazione magari puoi scegliere fra 8, 16, 32 e 64 bit.
Ora è più chiaro. Comunque, in generale, dati $n$ bit il massimo numero che può essere rappresentato è $2^(n-1)-1$, poi chiaramente si possono inserire quanto bit si vuole.
Ma quindi il concetto di complemento a 2 (su $n$ bit) serve solo per poter rappresentare numeri interi negativi in informatica? Per i numeri positivi non cambia nulla (si mettono degli zeri non significativi a sinistra), ma quelli negativi diventano tali per cui, se sommati con i rispettivi moduli, la somma viene una serie di zeri (il riporto si sposta almeno fino al bit $n+1$, per cui non viene registrato nella somma di $n$ bit.
Ad esempio, il complemento a 2 di $12$, su 8 bit, è $00001100$, mentre quello di $-12$ è $11110011$. Se sommo questi due numeri i primi 8 bit sono tutti nulli. Quindi, il concetto di complemento a 2 varia anche in base al numero di bit che si prendono: se considero 6 bit il complemento a 2 di $-12$ diventa $110011$.
"HowardRoark":
Ad esempio, il complemento a 2 di $12$, su 8 bit, è $00001100$, mentre quello di $-12$ è $11110011$.
Sei sicuro?
"ghira":
Sei sicuro?
11110100

"HowardRoark":
Ad esempio, il complemento a 2 di $12$, su 8 bit, è $00001100$,
Il tuo libro cosa dice, esattamente? Per esempio:
https://www.treccani.it/enciclopedia/complemento-a-due_(Enciclopedia-della-Matematica)/
dice "Il complemento a due di un numero è quel numero che sommato al numero di partenza dà un risultato formato di soli 0."
quindi il complemento a due di 1 è 11111. Era questo che intendevo con "Sei sicuro?". Mi rendo conto che la Treccani magari non è il posto ideale per cercare queste cose. C'è anche chi sembra dire che il complemento a due di un numero è la rappresentazione del numero stesso, quindi hmm.
"ghira":
Il tuo libro cosa dice, esattamente?
Non dà una definizione, questo concetto salta fuori in un paragrafo per rappresentare i numeri interi relativi (con segno) e ci si limita a dare le regole operative per determinare il complemento a 2 di un numero.
"ghira":
https://www.treccani.it/enciclopedia/complemento-a-due_(Enciclopedia-della-Matematica)/
dice "Il complemento a due di un numero è quel numero che sommato al numero di partenza dà un risultato formato di soli 0."
Per ora mi farò andare bene questa definizione. Considera che ho comprato questo libro solo per studiare qualcosa di programmazione su python, io però sono partito a leggerlo dall'inizio e quindi incappo anche in questi concetti, che presumo comunque essere fondamentali.
"HowardRoark":
ho comprato questo libro solo per studiare qualcosa di programmazione su python, io però sono partito a leggerlo dall'inizio e quindi incappo anche in questi concetti, che presumo comunque essere fondamentali.
Se progetti i microprocessori o scrivi in assembly, sapere esattamente come funziona il complemento a due potrebbe essere utile. O se scrivi programmi dove manipoli direttamente i bit, come in https://www.youtube.com/watch?v=p8u_k2LIZyo magari, ma secondo me potresti programmare in python per tutta la vita senza avere bisogno di sapere come funziona il complemento a due.
Magari qualcuno più informatico di me vede le cose diversamente.
Senza aprire un altro thread, ho un altro dubbio su questo complemento a 2. Il libro mi chiede di rappresentare $154$ in complemento a 2 su 8 bit. Ma $154_10 = 10011010_2$, cioè occupa già 8 bit e non mi entrerebbe il bit di segno. Quindi, il numero di bit minimo per poterlo rappresentare in complemento a 2 sarebbero 9 bit (e allora il complemento a 2 sarebbe $010011010_2$.
Poi il testo mi chiede "qual è il valore binario rappresentato, se si interpreta il numero come binario puro?
Anche qui non capisco: il complemento a 2 di un numero positivo è uguale al modulo del numero con $0$ come bit iniziale, che indica il segno, il valore binario rappresentato sarebbe quindi sempre 154.
Poi il testo mi chiede "qual è il valore binario rappresentato, se si interpreta il numero come binario puro?
Anche qui non capisco: il complemento a 2 di un numero positivo è uguale al modulo del numero con $0$ come bit iniziale, che indica il segno, il valore binario rappresentato sarebbe quindi sempre 154.
"HowardRoark":
il complemento a 2 di un numero $n>0$ e di $-n$ penso siano uguali.
Non capisco. Perché?
"ghira":
Non capisco. Perché?
Ho sbagliato, ho corretto perché non aveva senso che avessero lo stesso complemento a 2. Più che altro, il libro dà solo un modo per calcolarlo ma non dice cosa sia; adesso quindi guardo dei video su internet, sperando di schiarirmi le idee.
Sinceramente guardando a destra e a manca ti stai complicando la vita inutilmente; quella è solo una convenzione supportata certamente da una teoria matematica solida ma solo una convenzione.
Prenditi un libro anzi continua con quello che stai usando e comprendi bene quello. Punto. IMHO.
Cordialmente, Alex
Prenditi un libro anzi continua con quello che stai usando e comprendi bene quello. Punto. IMHO.
Cordialmente, Alex
Se vuoi imparare il Python, impara il Python, da un libro sul Python. Non saprei dirti quale perché non conosco il Python.
E se vuoi imparare l'informatica, non usare un libro della scuola secondaria.
Sapere come funziona il complemento a due mi sembra un argomento decisamente marginale nel 2024 per chi vuole programmare in Python, o onestamente per più o meno chiunque. Puoi benissimo fregartene.
E se vuoi imparare l'informatica, non usare un libro della scuola secondaria.
Sapere come funziona il complemento a due mi sembra un argomento decisamente marginale nel 2024 per chi vuole programmare in Python, o onestamente per più o meno chiunque. Puoi benissimo fregartene.
"HowardRoark":
... mi farò andare bene questa definizione.
Qualunque sia la base, le definizioni sono due:
Numero di cifre
$n$
Limitazioni
$0 lt= x lt= b^n-1$
Complemento alla base
$b^n-x$
Complemento alla base meno uno
$b^n-1-x$
Per esempio:
Base
$10$
Numero di cifre
$3$
Complemento a 10
$1000-x$
Complemento a 9
$999-x$
Base
$2$
Numero di cifre
$8$
Complemento a 2
$256-x$
Complemento a 1
$255-x$
Insomma, le regole pratiche per determinare il complemento alla base e il complemento ala base meno uno devono rispettare le definizioni di cui sopra.
"HowardRoark":
... mi chiede di rappresentare $154$ in complemento a 2 su 8 bit.
Si tratta di un esercizio che non ha nulla a che fare con la rappresentazione dei numeri negativi:
$256-154=102=01100110$
Il motivo per cui le definizioni di complemento alla base e di complemento alla base meno uno possano essere convenienti per rappresentare i numeri negativi è un passo successivo.
Grazie per la risposta noodles, alla fine, anche guardando alcuni video, sono riuscito a schiarirmi le idee. Come ha detto axpgn, penso si tratti di una convenzione questa cosa dei complementi[nota]per quello che ho capito io si tratta solo di un modo per rappresentare e per operare con i numeri negativi in un range che dipende dal numero di bit che scegli di usare[/nota] e forse non ha neanche troppo senso perderci così tanto tempo.
Riguardo il complemento a 2 su 8 bit, ho capito che:
1) ci sono 256 possibili combinazioni ($2^8$), e che il range varia da $-128$ a $+127$.
2) Il bit più significativo corrisponde a $-128$: per questo, tutti i binari che hanno 1 come bit più significativo sono negativi e il numero più negativo rappresentabile è appunto $10000000 = -128$. Il numero maggiore sarà quindi $01111111_2 = 127_10$.
Poi le operazioni sono abbastanza semplici, così come capire l'overflow e l'underflow. Per quello che devo saperne io credo sia abbastanza, se poi dovessi incontrare altre difficoltà allora rivedrò ancora il concetto.
Riguardo il complemento a 2 su 8 bit, ho capito che:
1) ci sono 256 possibili combinazioni ($2^8$), e che il range varia da $-128$ a $+127$.
2) Il bit più significativo corrisponde a $-128$: per questo, tutti i binari che hanno 1 come bit più significativo sono negativi e il numero più negativo rappresentabile è appunto $10000000 = -128$. Il numero maggiore sarà quindi $01111111_2 = 127_10$.
Poi le operazioni sono abbastanza semplici, così come capire l'overflow e l'underflow. Per quello che devo saperne io credo sia abbastanza, se poi dovessi incontrare altre difficoltà allora rivedrò ancora il concetto.
In parole povere ti consente di eseguire l'operazione sottostante:
utilizzando, solo per fare un esempio, 8 bit:
senza ulteriori complicazioni dovute al segno:
1. Se il bit più significativo è 0 la somma è positiva e, per determinarne il valore, non è necessario farne il complemento a due.
2. Se il bit più significativo è 1 la somma è negativa e, per determinarne il valore, è necessario farne il complemento a due.
$x_1+x_2$
utilizzando, solo per fare un esempio, 8 bit:
$-128 lt= (x_1+x_2)_10 lt= 127$
senza ulteriori complicazioni dovute al segno:
1. Se il bit più significativo è 0 la somma è positiva e, per determinarne il valore, non è necessario farne il complemento a due.
2. Se il bit più significativo è 1 la somma è negativa e, per determinarne il valore, è necessario farne il complemento a due.
"Noodles":
2. Se il bit più significativo è 1 la somma è negativa e, per determinarne il valore, è necessario farne il complemento a due.
Esatto, si fa il complemento a 2 per rendere più riconoscibile il modulo del risultato, tenendo sempre presente che è negativo se il bit più significativo è 1.