Che cos'è il "complemento di 2"?


434

Sono in un corso di sistemi informatici e ho lottato , in parte, con Two's Complement . Voglio capirlo, ma tutto ciò che ho letto non ha messo insieme l'immagine per me. Ho letto l' articolo di Wikipedia e vari altri articoli, incluso il mio libro di testo .

Quindi, volevo iniziare questo post wiki della comunità per definire cos'è il Complemento di Due, come usarlo e come può influenzare i numeri durante operazioni come cast (da firmato a non firmato e viceversa), operazioni bit-saggio e operazioni bit-shift .

Ciò che spero è una definizione chiara e concisa che possa essere facilmente compresa da un programmatore.

Risposte:


628

Il complemento a due è un modo intelligente di memorizzare numeri interi in modo che i problemi matematici comuni siano molto semplici da implementare.

Per capire, devi pensare ai numeri in binario.

In pratica dice

  • per zero, utilizzare tutti gli 0.
  • per numeri interi positivi, iniziare il conto alla rovescia, con un massimo di 2 (numero di bit - 1) -1.
  • per numeri interi negativi, fai esattamente la stessa cosa, ma cambia il ruolo di 0 e 1 (quindi invece di iniziare con 0000, inizia con 1111 - questa è la parte "complemento").

Proviamo con un mini-byte di 4 bit (lo chiameremo un bocconcino - 1/2 a byte).

  • 0000 - zero
  • 0001 - uno
  • 0010 - Due
  • 0011 - tre
  • 0100a 0111- quattro a sette

Questo è quanto possiamo andare in positivo. 2 3 -1 = 7.

Per negativi:

  • 1111 - negativo
  • 1110 - due negativi
  • 1101 - tre negativi
  • 1100a 1000- negativo quattro a negativo otto

Nota che ottieni un valore extra per i negativi ( 1000= -8) che non per i positivi. Questo perché 0000viene utilizzato per zero. Questo può essere considerato come linea numerica dei computer.

Distinguere tra numeri positivi e negativi

In questo modo, il primo bit ottiene il ruolo del bit "segno", in quanto può essere utilizzato per distinguere tra valori decimali non negativi e negativi. Se il bit più significativo è 1, allora 0si può dire che il binario è negativo , dove come se fosse il bit più significativo (il più a sinistra) , si può dire che il valore decimale non è negativo.

I numeri negativi del "complemento a uno" capovolgono semplicemente il bit del segno, quindi contano da 0. Ma questo approccio ha a che fare con l'interpretazione 1000come "zero negativo" che confonde. In genere devi preoccuparti di questo solo quando lavori vicino all'hardware.


148
Probabilmente la parte migliore del complemento a due è come semplifica la matematica. Prova ad aggiungere 2 (0010) e -2 (1110) insieme e ottieni 10000. Il bit più significativo è overflow, quindi il risultato è in realtà 0000. Quasi come per magia, 2 + -2 = 0.
Naaff,

96
Un altro vantaggio oltre alla semplice aggiunta e sottrazione è che il complemento 2s ha solo uno zero. Se si utilizzava un semplice bit di segno, si supponga di utilizzare 0001 per rappresentare +1 e 1001 per rappresentare -1, si avrebbero due zeri: 0000 ("+0") e 1000 ("-0"). È un vero dolore alle spalle.
Jörg W Mittag,

26
Voto positivo per essere al punto e anche per spiegare perché i valori negativi hanno un intervallo più ampio di quelli positivi. Sono venuto alla ricerca del motivo della differenza di portata.
Ashwin,

2
Non dovresti dire "per numeri interi negativi, fai esattamente la stessa cosa ma conto alla rovescia e cambia il ruolo di 0 e 1"
Koray Tugay,

1
Fantastico. Aggiunte parti extra di conversione di bit in numero intero negativo.
Suraj Jain,

340

Mi chiedo se potrebbe essere spiegato meglio dell'articolo Wikipedia.

Il problema di base che si sta tentando di risolvere con la rappresentazione del complemento a due è il problema della memorizzazione di numeri interi negativi.

Considerare innanzitutto un numero intero senza segno memorizzato in 4 bit. Puoi avere quanto segue

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

Questi sono senza segno perché non vi è alcuna indicazione se siano negativi o positivi.

Firma magnitudine e notazione in eccesso

Per memorizzare numeri negativi puoi provare una serie di cose. Innanzitutto, è possibile utilizzare la notazione della magnitudine del segno che assegna il primo bit come bit del segno per rappresentare +/- e i bit rimanenti per rappresentare la grandezza. Quindi, usando di nuovo 4 bit e assumendo che 1 significhi - e 0 significa +, allora hai

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7

Quindi, vedi il problema lì? Abbiamo 0 positivi e negativi. Il problema maggiore è l'aggiunta e la sottrazione di numeri binari. I circuiti da aggiungere e sottrarre usando la grandezza del segno saranno molto complessi.

Cosa è

0010
1001 +
----

?

Un altro sistema è la notazione in eccesso . È possibile memorizzare numeri negativi, eliminare il problema dei due zeri ma l'addizione e la sottrazione rimangono difficili.

Quindi arriva il complemento a due. Ora puoi memorizzare numeri interi positivi e negativi ed eseguire l'aritmetica con relativa facilità. Esistono diversi metodi per convertire un numero nel complemento a due. Eccone uno.

Converti il ​​decimale in complemento a due

  1. Converti il ​​numero in binario (ignora il segno per ora) ad esempio 5 è 0101 e -5 è 0101

  2. Se il numero è positivo, il gioco è fatto. es. 5 è 0101 in binario usando la notazione a due complementi.

  3. Se il numero è negativo, allora

    3.1 trova il complemento (inverti 0 e 1), ad esempio -5 è 0101, quindi trovare il complemento è 1010

    3.2 Aggiungi 1 al complemento 1010 + 1 = 1011. Pertanto, -5 nel complemento a due è 1011.

Quindi, se volessi fare 2 + (-3) in binario? 2 + (-3) è -1. Cosa dovresti fare se utilizzassi la magnitudine dei segni per aggiungere questi numeri? 0010 + 1101 =?

Utilizzando il complemento a due considera quanto sarebbe facile.

 2  =  0010
 -3 =  1101 +
 -------------
 -1 =  1111

Conversione del complemento a due in decimale

Conversione di 1111 in decimale:

  1. Il numero inizia con 1, quindi è negativo, quindi troviamo il complemento di 1111, che è 0000.

  2. Aggiungi 1 a 0000 e otteniamo 0001.

  3. Convertire 0001 in decimale, che è 1.

  4. Applica il segno = -1.

Tada!


45
La migliore risposta secondo me.
Koray Tugay,

5
sì, questo è piuttosto semplice e spiega molto bene la questione
Max Koretskyi,

3
Non capisco come l'aggiunta di uno durante la conversione in entrambi i modi porti sempre allo stesso numero. Nella mia mente invertiresti i passi o sottraresti uno o qualcosa.
Marcos Pereira,

2
Perché aggiungere 1 al complemento?
Zinan Xing,

4
Questa risposta dovrebbe essere usata su Wikipedia.
Hiroki,

119

Come la maggior parte delle spiegazioni che ho visto, quelle sopra sono chiare su come lavorare con il complemento di 2, ma non spiegano veramente cosa sono matematicamente. Proverò a farlo, almeno per i numeri interi, e tratterò alcuni retroscena probabilmente prima familiari.

Ricorda come funziona per i decimali:
  2345
è un modo di scrivere
  2 × 10 3 + 3 × 10 2 + 4 × 10 1 + 5 × 10 0 .

Allo stesso modo, il binario è un modo di scrivere numeri usando solo 0 e 1 seguendo la stessa idea generale, ma sostituendo quei 10s sopra con 2s. Quindi, in binario,
  1111
è un modo di scrivere
  1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0
e se lo risolvi, risulta essere uguale a 15 (base 10). Questo perché è
  8 + 4 + 2 + 1 = 15.

Questo va bene e va bene per i numeri positivi. Funziona anche con numeri negativi se sei disposto a mettere un segno meno davanti a loro, come fanno gli umani con i numeri decimali. Questo può anche essere fatto nei computer, in un certo senso, ma non ho visto un simile computer dai primi anni '70. Lascerò i motivi di una discussione diversa.

Per i computer risulta essere più efficiente utilizzare una rappresentazione del complemento per i numeri negativi. Ed ecco qualcosa che viene spesso trascurato. Le notazioni del complemento comportano una sorta di inversione delle cifre del numero, anche gli zero impliciti che precedono un normale numero positivo. È imbarazzante, perché sorge la domanda: tutti loro? Potrebbe essere un numero infinito di cifre da considerare.

Fortunatamente, i computer non rappresentano gli infiniti. I numeri sono vincolati a una determinata lunghezza (o larghezza, se preferisci). Quindi torniamo ai numeri binari positivi, ma con una dimensione particolare. Userò 8 cifre ("bit") per questi esempi. Quindi il nostro numero binario sarebbe davvero
  00001111
o
  0 × 2 7 + 0 × 2 6 + 0 × 2 5 + 0 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0

Per formare il negativo del complemento a 2, per prima cosa completiamo tutte le cifre (binarie) nel modulo
  11110000
e aggiungiamo 1 al modulo
  11110001,
ma come possiamo capire che significa -15?

La risposta è che cambiamo il significato del bit di ordine superiore (quello più a sinistra). Questo bit sarà un 1 per tutti i numeri negativi. Il cambiamento sarà quello di cambiare il segno del suo contributo al valore del numero in cui appare. Quindi ora il nostro 11110001 è inteso rappresentare
  - 1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 1 × 2 4 + 0 × 2 3 + 0 × 2 2 + 0 × 2 1 + 1 × 2 0
Notare che "-" davanti a quell'espressione? Significa che il bit del segno ha il peso -2 7 , cioè -128 (base 10). Tutte le altre posizioni mantengono lo stesso peso che avevano nei numeri binari senza segno.

Elaborando il nostro -15, è
  -128 + 64 + 32 + 16 + 1
Provalo sulla tua calcolatrice. sono -15.

Dei tre modi principali in cui ho visto i numeri negativi rappresentati nei computer, il complemento di 2 vince a mani basse per comodità nell'uso generale. Ha una stranezza, però. Poiché è binario, ci deve essere un numero pari di possibili combinazioni di bit. Ogni numero positivo può essere associato al suo negativo, ma c'è solo uno zero. Negare uno zero ti dà zero. Quindi c'è un'altra combinazione, il numero con 1 nel bit del segno e 0 ovunque. Il corrispondente numero positivo non si adatterebbe al numero di bit utilizzati.

La cosa ancora più strana di questo numero è che se provi a formarne il positivo completando e aggiungendo uno, ottieni lo stesso numero negativo. Sembra naturale che lo zero farebbe questo, ma questo è inaspettato e non è affatto il comportamento a cui siamo abituati perché a parte i computer, generalmente pensiamo a un numero illimitato di cifre, non a questa aritmetica a lunghezza fissa.

È come la punta di un iceberg di stranezze. C'è di più in agguato sotto la superficie, ma è abbastanza per questa discussione. Probabilmente potresti trovare di più se cerchi "overflow" per l'aritmetica in virgola fissa. Se vuoi davvero approfondire, potresti anche cercare "aritmetica modulare".


1
Mi piace questa risposta! Spiega come funziona il complemento di 2 secondi e l'aggiunta di uno.
SJ.

Mi piace anche questa risposta. Soprattutto dove mostri come viene rappresentato il numero negativo. Qui ho pensato che il numero intero fosse invertito, non solo l'MSB e quindi aggiunto nuovamente gli altri valori ponderati. Grazie, questo ha risolto il mio blocco cerebrale
user188757

Ottimo lavoro menzionando il numero dispari che non ha un inverso. Ma cosa facciamo al riguardo? Impostiamo il flag di overflow se qualcuno tenta di invertirlo?
NH.

Mentre altre risposte si concentrano sul "come", questa risposta ci conduce delicatamente con il "perché". Mi ha aiutato Grazie!
Abhishek Pathak,

Se un numero termina con 11000 ... 000, l'inversione produrrà 01000 ... 000. La notazione del complemento a due si basa sull'idea che tutte le cifre a sinistra della cifra rappresentata più a sinistra dovrebbero avere lo stesso valore di quella cifra, ma quando si inverte un numero la cui rappresentazione è 1000 ... 000, ciò non sarà vero.
supercat

20

Il complemento di 2 è molto utile per trovare il valore di un binario, tuttavia ho pensato a un modo molto più conciso di risolvere un tale problema (mai visto nessun altro pubblicarlo):

prendi un binario, ad esempio: 1101 che è [supponendo che lo spazio "1" sia il segno] uguale a -3 .

usando il complemento di 2 faremmo questo ... capovolgi da 1101 a 0010 ... aggiungi 0001 + 0010 ===> ci dà 0011. 0011 in binario positivo = 3. quindi 1101 = -3 !

Quello che ho realizzato:

invece di tutto il capovolgere e aggiungere, puoi semplicemente fare il metodo di base per risolvere un binario positivo (diciamo 0101) è (2 3 * 0) + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = 5.

Fai esattamente lo stesso concetto con un negativo! (Con una piccola svolta)

prendi 1101, ad esempio:

per il primo numero anziché 2 3 * 1 = 8 , fare - (2 3 * 1) = -8 .

quindi continua come al solito, facendo -8 + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = -3


1
Il modo migliore, ho capito il complemento di 2. Dopo aver letto questo, ho capito tutte le risposte alla domanda sopra.
Shakeel Shahzad,

1
Questo metodo è menzionato nel libro Computer Systems: la prospettiva di un programmatore.
jimo,

1
Questo è un modo molto più veloce!
chanzerre,

14

Immagina di avere un numero finito di bit / trits / cifre / qualunque cosa. Definisci 0 perché tutte le cifre sono 0 e conti naturalmente verso l'alto:

00
01
02
..

Alla fine traboccerai.

98
99
00

Abbiamo due cifre e possiamo rappresentare tutti i numeri da 0 a 100. Tutti questi numeri sono positivi! Supponiamo di voler rappresentare anche numeri negativi?

Quello che abbiamo davvero è un ciclo. Il numero prima di 2 è 1. Il numero prima di 1 è 0. Il numero prima di 0 è ... 99 .

Quindi, per semplicità, diciamo che qualsiasi numero superiore a 50 è negativo. Da "0" a "49" rappresentano da 0 a 49. "99" è -1, "98" è -2, ... "50" è -50.

Questa rappresentazione è il complemento di dieci . I computer in genere usano il complemento a due , che è lo stesso tranne che per i bit anziché le cifre.

La cosa bella del complemento a dieci è che l'aggiunta funziona . Non è necessario fare nulla di speciale per aggiungere numeri positivi e negativi!


9

Ho letto una fantastica spiegazione su Reddit di jng, usando l'odometro come analogia.

inserisci qui la descrizione dell'immagine

È una convenzione utile. Gli stessi circuiti e operazioni logiche che aggiungono / sottraggono numeri positivi in ​​binario funzionano ancora su numeri positivi e negativi se si utilizza la convenzione, ecco perché è così utile e onnipresente.

Immagina il contachilometri di un'auto, che gira a (diciamo) 99999. Se aumenti 00000 ottieni 00001. Se decrementi 00000, ottieni 99999 (a causa del roll-around). Se ne aggiungi uno a 99999, torna a 00000. Quindi è utile decidere che 99999 rappresenta -1. Allo stesso modo, è molto utile decidere che 99998 rappresenta -2 e così via. Devi fermarti da qualche parte, e anche per convenzione, la metà superiore dei numeri è considerata negativa (50000-99999) e la metà inferiore positiva si distingue (00000-49999). Di conseguenza, la cifra superiore che è 5-9 indica che il numero rappresentato è negativo e che 0-4 indica che il numero rappresentato è positivo, esattamente uguale al bit superiore che rappresenta il segno nel numero binario del complemento a due.

Capire questo è stato difficile anche per me. Una volta che l'ho preso e sono tornato a rileggere gli articoli e le spiegazioni dei libri (allora non c'era internet), si è scoperto che molti di quelli che lo descrivevano non lo capivano davvero. In seguito ho scritto un libro che insegnava la lingua delle assemblee (che ha venduto abbastanza bene per 10 anni).


5

Si scopre due complementi aggiungendo uno al primo complemento del numero dato. Diciamo che dobbiamo scoprire due complementi e 10101poi trovare i suoi complementi, cioè 01010aggiungere 1a questo risultato, cioè 01010+1=01011, che è la risposta finale.


4

Consente di ottenere la risposta 10-12 in forma binaria utilizzando 8 bit: quello che faremo davvero è 10 + (-12)

Dobbiamo ottenere la parte di complimento di 12 per sottrarla da 10. 12 in binario è 00001100. 10 in binario è 00001010.

Per ottenere la parte del complimento di 12, invertiamo tutti i bit e poi aggiungiamo 1. 12 in binary reverse è 11110011. Questo è anche il codice Inverse (complemento). Ora dobbiamo aggiungerne uno, che ora è 11110100.

Quindi 11110100 è il complimento di 12! Facile quando ci pensi in questo modo.

Ora puoi risolvere la domanda sopra 10 - 12 in forma binaria.

00001010
11110100
-----------------
11111110  

3

Complementi di 2: quando ne aggiungiamo uno in più con i complementi di 1 di un numero, otterremo i complementi di 2. Ad esempio: 100101 il complemento di 1 è 011010 e il complemento di 2 è 011010 + 1 = 011011 (Aggiungendo uno con il complemento di 1) Per ulteriori informazioni questo articolo lo spiega graficamente.


plus1 per il link che ha una spiegazione con il cerchio
Manohar Reddy Poreddy il

3

Guardare il sistema del complemento a due dal punto di vista della matematica ha davvero senso. Nel complemento a dieci, l'idea è essenzialmente di "isolare" la differenza.

Esempio: 63-24 = x

Aggiungiamo il complemento di 24 che è davvero giusto (100 - 24). Quindi davvero, tutto ciò che stiamo facendo è aggiungere 100 su entrambi i lati dell'equazione.

Ora l'equazione è: 100 + 63 - 24 = x + 100, ecco perché rimuoviamo il 100 (o 10 o 1000 o altro).

A causa dell'inconveniente situazione di dover sottrarre un numero da una lunga catena di zero, utilizziamo un sistema di "complemento radix ridotto", nel sistema decimale, complemento di nove.

Quando ci viene presentato un numero sottratto da una grande catena di nove, dobbiamo solo invertire i numeri.

Esempio: 99999-03275 = 96724

Questo è il motivo, dopo il complemento di nove, aggiungiamo 1. Come probabilmente saprai dalla matematica dell'infanzia, 9 diventa 10 "rubando" 1. Quindi in pratica è solo il complemento di dieci che prende 1 dalla differenza.

In binario, il complemento a due è equivalente al complemento a dieci, mentre il complemento a due al complemento a nove. La differenza principale è che invece di cercare di isolare la differenza con poteri di dieci (aggiungendo 10, 100, ecc. Nell'equazione) stiamo cercando di isolare la differenza con poteri di due.

È per questo motivo che invertiamo i bit. Proprio come il nostro minuend è una catena di nove in decimale, il nostro minuend è una catena di nove in binario.

Esempio: 111111-101001 = 010110

Poiché le catene di una sono inferiori di 1 a una buona potenza di due, "rubano" 1 dalla differenza come nove in decimale.

Quando stiamo usando numeri binari negativi, stiamo davvero dicendo:

0000 - 0101 = x

1111 - 0101 = 1010

1111 + 0000 - 0101 = x + 1111

Per "isolare" x, dobbiamo aggiungere 1 perché 1111 è uno diverso da 10000 e rimuoviamo il 1 iniziale perché lo abbiamo appena aggiunto alla differenza originale.

1111 + 1 + 0000 - 0101 = x + 1111 + 1

10000 + 0000 - 0101 = x + 10000

Basta rimuovere 10000 da entrambi i lati per ottenere x, è un'algebra di base.


3

Molte delle risposte finora spiegano bene perché il complemento di due viene usato per rappresentare un numero negativo, ma non ci dicono quale sia il numero di complemento di due, in particolare non perché viene aggiunto un '1', e in effetti spesso viene aggiunto in modo sbagliato.

La confusione deriva da una scarsa comprensione della definizione di un numero di complemento. Un complemento è la parte mancante che renderebbe qualcosa di completo.

Il complemento radix di un numero di n cifre x in radix b è, per definizione, b ^ nx. Nel binario 4 è rappresentato da 100, che ha 3 cifre (n = 3) e una radice di 2 (b = 2). Quindi il suo complemento radix è b ^ nx = 2 ^ 3-4 = 8-4 = 4 (o 100 in binario).

Tuttavia, nell'ottenere binario il complemento di un radix non è facile come ottenere il suo complemento di radix ridotto, che è definito come (b ^ n-1) -y, solo 1 in meno di quello del complemento di radix. Per ottenere un complemento radix ridotto, capovolgi semplicemente tutte le cifre.

100 -> 011 (complemento radix ridotto)

per ottenere il complemento radix (due), aggiungiamo semplicemente 1, come definito dalla definizione.

011 +1 -> 100 (complemento a due).

Ora con questa nuova comprensione, diamo un'occhiata all'esempio dato da Vincent Ramdhanie (vedi sopra la seconda risposta)

/ * inizio di Vincent

Conversione di 1111 in decimale:

Il numero inizia con 1, quindi è negativo, quindi troviamo il complemento di 1111, che è 0000. Aggiungi 1 a 0000 e otteniamo 0001. Converti 0001 in decimale, che è 1. Applica il segno = -1. Tada!

fine di Vincent * /

Dovrebbe essere inteso come

Il numero inizia con 1, quindi è negativo. Quindi sappiamo che è un complemento a due di un valore x. Per trovare la x rappresentata dal suo complemento a due, dobbiamo prima trovare il complemento a 1.

complemento a due di x: 1111 complemento a uno di x: 1111-1 -> 1110; x = 0001, (capovolgi tutte le cifre)

applica il segno - e la risposta = -x = -1.


3

La parola complemento deriva dalla completezza. Nel mondo decimale i numeri da 0 a 9 forniscono un complemento (set completo) di numeri o simboli numerici per esprimere tutti i numeri decimali. Nel mondo binario i numeri 0 e 1 forniscono un complemento di numeri per esprimere tutti i numeri binari. In effetti i simboli 0 e 1 devono essere usati per rappresentare tutto (testo, immagini, ecc.) Nonché positivo (0) e negativo (1). Nel nostro mondo lo spazio vuoto a sinistra del numero è considerato zero:

                  35=035=000000035.

In una posizione di archiviazione del computer non c'è spazio vuoto. Tutti i bit (cifre binarie) devono essere 0 o 1. Per utilizzare in modo efficiente i numeri di memoria possono essere memorizzati come rappresentazioni a 8 bit, 16 bit, 32 bit, 64 bit, 128 bit. Quando un numero memorizzato come numero a 8 bit viene trasferito in una posizione a 16 bit, il segno e la grandezza (valore assoluto) devono rimanere gli stessi. Sia il complemento di 1 sia le rappresentazioni di complemento di 2 facilitano questo. Come sostantivo: sia il complemento di 1 che il complemento di 2 sono rappresentazioni binarie di quantità con segno in cui il bit più significativo (quello a sinistra) è il bit del segno. 0 è per positivo e 1 per negativo. Il complemento 2s non significa negativo. Significa una quantità firmata. Come in decimale, la grandezza è rappresentata come quantità positiva. La struttura utilizza l'estensione del segno per preservare la quantità quando si promuove in un registro [] con più bit:

       [0101]=[00101]=[00000000000101]=5 (base 10)
       [1011]=[11011]=[11111111111011]=-5(base 10)

Come un verbo: il complemento di 2 significa negare . Non significa rendere negativo. Significa che se negativo diventa positivo; se positivo diventa negativo. La grandezza è il valore assoluto:

        if a >= 0 then |a| = a
        if a < 0 then |a| = -a = 2scomplement of a

Questa capacità consente un'efficace sottrazione binaria usando annulla quindi aggiungi. a - b = a + (-b)

Il modo ufficiale di prendere il complemento di 1 è per ogni cifra sottrarre il suo valore da 1.

        1'scomp(0101) = 1010.

Ciò equivale a capovolgere o invertire ciascun bit singolarmente. Ciò si traduce in uno zero negativo che non è molto amato, quindi l'aggiunta di uno al complemento di te 1 elimina il problema. Per negare o prendere il complemento 2s prima prendi il complemento 1s quindi aggiungi 1.

        Example 1                             Example 2
         0101  --original number              1101
         1's comp  1010                       0010
         add 1     0001                       0001
         2's comp  1011  --negated number     0011

Negli esempi la negazione funziona anche con i numeri estesi segno.

Aggiunta:
1110 Carry 111110 Carry 0110 è uguale a 000110 1111 111111 somma 0101 somma 000101

sottraendo:

    1110  Carry                      00000   Carry
     0110          is the same as     00110
    -0111                            +11001
  ----------                        ----------
sum  0101                       sum   11111

Si noti che quando si lavora con il complemento di 2, lo spazio vuoto a sinistra del numero viene riempito di zeri per i numeri positivi, ma di quelli per i numeri negativi. Il carry viene sempre aggiunto e deve essere 1 o 0.

Saluti


3

Il complemento di 2 è essenzialmente un modo per ottenere l'inverso additivo di un numero binario. Chiediti questo: dato un numero in forma binaria, quale modello di bit, se aggiunto al numero originale, renderebbe il risultato zero? Se riesci a trovare questo schema di bit, questo schema di bit è la rappresentazione -ve (inversa additiva) del numero originale; come per definizione l'aggiunta di un numero al suo inverso additivo dovrebbe sempre portare a zero. Esempio: prendere 101, che è decimale 5. Ora il compito è di creare un modello di bit che se aggiunto al modello di bit dato (101) si tradurrebbe in zero. Per fare ciò, inizia dal bit più a destra di 101 e per ogni singolo bit, fai di nuovo la stessa domanda: quale bit dovrei aggiungere a "questo" bit per rendere il risultato zero? continuare a farlo tenendo conto del solito riporto. Dopo che abbiamo finito con i 3 posti più a destra (le cifre che definiscono il numero originale senza tener conto degli zeri iniziali) l'ultimo carry passa nel modello di bit dell'inverso dell'additivo. Inoltre, dal momento che potremmo trattenere il numero originale in un singolo byte, tutti gli altri bit iniziali nell'inverso dell'additivo dovrebbero essere anche 1, in modo che quando il computer aggiunge il numero e l'inverso dell'additivo usando "quel" tipo di archiviazione (char) il risultato in quel carattere sarebbe tutto zeri.

 1 1 1
 ----------
   1 0 1
 1 0 1 1 ---> additive inverse
  ---------
   0 0 0

2

Mi è piaciuta la risposta di Lavinio, ma spostare i bit aggiunge una certa complessità. Spesso è possibile scegliere di spostare i bit rispettando il bit del segno o senza rispettare il bit del segno. Questa è la scelta tra trattare i numeri come firmati (da -8 a 7 per un nibble, da -128 a 127 per byte) o numeri senza segno a intervallo completo (da 0 a 15 per i nibble, da 0 a 255 per byte).


2

È un mezzo intelligente per codificare numeri interi negativi in ​​modo tale che circa la metà della combinazione di bit di un tipo di dati sia riservata a numeri interi negativi e l'aggiunta della maggior parte dei numeri interi negativi con i loro numeri interi positivi corrispondenti si traduce in un overflow del carry che lascia il risultato pari a zero binario.

Quindi, nel complemento di 2 se uno è 0x0001, -1 è 0x1111, poiché ciò comporterà una somma combinata di 0x0000 (con un overflow di 1).


1

Il complemento a due è uno dei modi per esprimere un numero negativo e la maggior parte dei controller e dei processori memorizza un numero negativo nella forma del complemento a 2


1
Questo non aggiunge nulla alle informazioni fornite da altre risposte.
Adrian Mole,

1

Il complemento a due viene utilizzato principalmente per i seguenti motivi:

  1. Per evitare rappresentazioni multiple di 0
  2. Per evitare di tenere traccia del bit di trasporto (come nel proprio complemento) in caso di overflow.
  3. Eseguire operazioni semplici come addizione e sottrazione diventa facile.

0

RIFERIMENTO: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

Inverto tutti i bit e aggiungo 1. A livello di codice:

  // in C++11
  int _powers[] = {
      1,
      2,
      4,
      8,
      16,
      32,
      64,
      128
  };

  int value=3;
  int n_bits=4;
  int twos_complement = (value ^ ( _powers[n_bits]-1)) + 1;

Anche l'assemblatore sarebbe di livello troppo alto. È necessario vedere uno schema a livello di gate della logica di addizione. Con cicli a T. Sei algoriticamente corretto.
mckenzm,

0

Il complemento di 2 di un determinato numero è il n. ottenuto aggiungendo 1 con il complemento di 1 del no. supponiamo di avere un numero binario: 10111001101 Il complemento di 1 è: 01000110010 E il complemento di 2 sarà: 01000110011


0

Per completare bit a bit un numero è capovolgere tutti i bit in esso. A due completarlo, capovolgiamo tutti i bit e ne aggiungiamo uno.

Usando la rappresentazione del complemento di 2 per numeri interi con segno, applichiamo l'operazione di complemento del 2 per convertire un numero positivo nel suo equivalente negativo e viceversa. Quindi, usando gli stuzzichini per un esempio, 0001(1) diventa 1111(-1) e applicando di nuovo l'operazione op, ritorna a 0001.

Il comportamento dell'operazione a zero è vantaggioso nel fornire una rappresentazione unica per zero senza una gestione speciale degli zero positivi e negativi. 0000integra a 1111, che quando viene aggiunto 1. trabocca 0000, dandoci uno zero, piuttosto che uno positivo e uno negativo.

Un vantaggio chiave di questa rappresentazione è che i circuiti di addizione standard per numeri interi senza segno producono risultati corretti se applicati a essi. Ad esempio aggiungendo 1 e -1 in stuzzichini:0001 + 1111 i bit traboccano fuori dal registro, lasciandosi indietro 0000.

Per una dolce introduzione, i meravigliosi Computerphile hanno prodotto un video sull'argomento .


0

In parole povere 2's Complement è un modo per memorizzare un numero negativo nella memoria del computer. Considerando che i numeri positivi sono memorizzati come numero binario normale.

Consideriamo questo esempio,

Il computer utilizza Binary Number Systemper rappresentare qualsiasi numero.

x = 5;

Questo è rappresentato come 0101.

x = -5;

Quando il computer incontra il -segno, calcola il complemento di 2 e lo memorizza. i.e5 = 0101 ed è il complemento di 2 è 1011.

Regole importanti che il computer utilizza per elaborare i numeri sono,

  1. Se il primo bit è 1allora deve essere un negativenumero.
  2. Se tutti i bit tranne il primo bit sono 0allora è un numero positivo perché non esiste un -0sistema numerico ( 1000 is not -0invece è positivo8 )
  3. Se tutti i bit lo sono, 0lo è0 .
  4. Altrimenti è un positive number.


-6

La risposta più semplice:

1111 + 1 = (1) 0000. Quindi 1111 deve essere -1. Quindi -1 + 1 = 0.

È perfetto per capirli tutti.


Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti a un autore, lascia un commento sotto il suo post.
Codor,

È la risposta. Il più semplice. Per me - il migliore.
Dmitry,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.