Domanda

Sono solo curioso di sapere se c'è un motivo per cui al fine di rappresentare -1 in binario, viene utilizzato complemento a due:? Lanciando i bit e l'aggiunta di 1

-1 è rappresentato da 11111111 (complemento a due) piuttosto che (a me più intuitiva) 10000001 che è binario 1 con primo bit segnala come negativo.

Disclaimer:! Io non contare su aritmetica binaria per il mio lavoro

È stato utile?

Soluzione

E 'fatto in modo che l'aggiunta non ha bisogno di avere alcuna logica speciale per trattare con i numeri negativi. Scopri l'articolo su Wikipedia .

Diciamo che sono due numeri, 2 e -1. Nel vostro modo "intuitivo" di rappresentare numeri, sarebbero 0010 e 1001, rispettivamente (sto attaccando a 4 bit per dimensione). In modo complemento a due, sono 0010 e 1111. Ora, diciamo che voglio aggiungere loro.

Oltre complemento a due è molto semplice. Si aggiungono i numeri normalmente e qualsiasi bit di riporto alla fine viene scartato. Quindi sono aggiunti i seguenti:

  0010
+ 1111
=10001
= 0001 (discard the carry)

0001 è 1, che è il risultato atteso di "2 + (- 1)".

Ma nel metodo "intuitivo", aggiungendo è più complicato:

  0010
+ 1001
= 1011

Il che è -3, giusto? Semplice Inoltre non funziona in questo caso. È necessario notare che uno dei numeri è negativo e utilizzare un algoritmo diverso, se questo è il caso.

Per questo metodo di memorizzazione "intuitivo", sottrazione è un'operazione diversa rispetto Inoltre, richiedere controlli supplementari dei numeri prima che possano essere aggiunti. Dal momento che si desidera che le operazioni più basilari (addizione, sottrazione, ecc) di essere il più veloce possibile, è necessario memorizzare i numeri in un modo che consente di utilizzare gli algoritmi più semplici possibile.

Inoltre, nel metodo di memorizzazione "intuitivo", ci sono due zeri:

0000  "zero"
1000  "negative zero"

Quali sono intuitivamente lo stesso numero, ma hanno due diversi valori, se conservato. Ogni applicazione avrà bisogno di adottare misure supplementari per assicurarsi che i valori diversi da zero, non sono anche pari a zero negativo.

C'è un altro bonus con la memorizzazione di interi in questo modo, e che quando è necessario estendere la larghezza della registrare il valore viene memorizzato in. Con complemento a due, la memorizzazione di un numero a 4 bit in un registro a 8 bit è una questione di ripetere il suo bit più significativo:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

E 'solo una questione di guardare il bit di segno della parola più piccolo e ripetere fino a quando non pads la larghezza della parola più grande.

Con il metodo si avrebbe bisogno di azzerare il bit esistente, che è un'operazione in più oltre al padding:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

Hai ancora bisogno di impostare quelli extra 4 bit in entrambi i casi, ma nel caso "intuitivo" è necessario cancellare la quinta punta pure. E 'un piccolo passo in più in una delle operazioni più importanti e comuni presenti in ogni applicazione.

Altri suggerimenti

Wikipedia dice tutto:

  

Il sistema complemento a due ha il vantaggio di non richiedere che la circuiteria addizione e sottrazione esaminare i segni degli operandi per determinare se aggiungere o sottrarre. Questa struttura rende il sistema sia semplice da implementare e in grado di gestire facilmente maggiore precisione aritmetica. Inoltre, zero ha una sola rappresentazione, ovviando sottigliezze associati con lo zero negativo, che esiste in sistemi ones'-complemento.

In altre parole, l'aggiunta è la stessa, indipendentemente da fatto il numero è negativo.

Anche se questa domanda è vecchia, mi permetta di mettere nei miei 2 centesimi.

Prima di spiegare questo, torniamo alle origini. 2' complemento è 1 complemento + 1. Ora che cosa è il complemento 1 e di ciò che è il suo significato in aggiunta.

Somma di qualsiasi numero n-bit e completare la sua 1 vi offre il più alto numero possibile che può essere rappresentato da quei n-bit. Esempio:

 0010 (2 in 4 bit system)
+1101 (1's complement of 2)
___________________________
 1111  (the highest number that we can represent by 4 bits)

Ora che cosa accadrà se cerchiamo di aggiungere 1 di più per il risultato. Sarà risultati in un overflow.

Il risultato sarà 1 0000 che è 0 (come stiamo lavorando con i numeri 4 bit (il 1 a sinistra è un overflow)

Any n-bit number + its 1's complement = max n-bit number
Any n-bit number + its 1'complement + 1 = 0 ( as explained above, overflow will occur as we are adding 1 to max n-bit number)

Qualcuno poi ha deciso di chiamare il numero 1 complemento + 1 come 2'complement. Quindi la dichiarazione di cui sopra diventa: Qualsiasi numero n'bit + il suo complemento a 2 = 0 il che significa che il complemento di un numero 2 di = - (di quel numero)

Tutto questo produce ancora una domanda, perché siamo in grado di utilizzare solo il numero positivo (n-1) dei bit n per rappresentare e perché il bit n-esimo più a sinistra rappresentano il segno (0 sui bit più a sinistra mezzo + numero ve, e 1 significa numero -ve). es Perché usiamo solo i primi 31 bit di un int in Java per rappresentare numero positivo se il bit 32a è 1, è un numero -ve.

 1100 (lets assume 12 in 4 bit system)
+0100(2's complement of 12)
___________________________

1 0000 (risultato è zero, con il riporto 1 traboccante)

In questo modo il sistema di (n + 2'complement di n) = 0, funziona ancora. L'unica ambiguità ecco complemento 12 2 della partita è 0100, che rappresenta anche ambiguo +8, oltre a rappresentare -12 nel sistema del complemento 2s.

Questo problema sarà risolto se i numeri positivi hanno sempre un 0 nella loro bit più a sinistra. In tal caso il loro complemento 2 avrà sempre un 1 nella loro bit più a sinistra, e si voleva avere l'ambiguità della stessa serie di bit che rappresentano complemento a 2 del nonché un numero + ve.

complemento a due permette addizione e sottrazione da fare in modo normale (come te ferita per i numeri senza segno). Inoltre impedisce -0 (modo separato per rappresentare 0 che non sarebbe uguale a 0 con il normale metodo bit per bit di confronto di numeri).

questo è quello di semplificare le somme e differenze di numeri. una somma di un numero negativo e positivo codificato in complemento 2 della partita è la stessa di loro sommando in modo normale.

Il solito attuazione dell'operazione è "capovolgere i bit e aggiungere 1", ma c'è un altro modo di definirlo che rende probabilmente la logica più chiara. complemento a 2 è la forma che si ottiene se si prende la solita rappresentazione senza segno in cui ogni bit controlla la successiva potenza di 2, e basta fare il termine più significativo negativo.

Prendendo un valore a 8 bit a 7 un 6 un 5 un 4 un 3 un 2 un 1 un 0

La solita interpretazione binario senza segno è:
2 7 * un 7 + 2 6 * un 6 + 2 5 * un 5 + 2 4 * un 4 + 2 3 * un 3 + 2 2 * un 2 + 2 1 * un 1 + 2 0 * un 0
11111111 = 64 + 128 + 32 + 16 + 8 + 4 + 2 + 1 = 255

L'interpretazione complemento a due è:
-2 7 * un 7 + 2 6 * un 6 + 2 5 * un 5 + 2 4 * un 4 + 2 3 * un 3 + 2 2 * un 2 + 2 1 * un 1 + 2 0 * un 0
11111111 = + 64 + -128 32 + 16 + 8 + 4 + 2 + 1 = -1

Nessuno degli altri bit cambia significato a tutti, e portando in un 7 è "troppo pieno" e non ci si aspetta di lavorare, in modo più o meno tutte le operazioni aritmetiche funzionare senza alcuna modifica (come altri hanno notato). Segno di magnitudo generalmente ispezionare il bit di segno e utilizzare logica diversa.

complemento a due permette numeri negativi e positivi da aggiungere insieme senza alcuna logica.

Se si è tentato di aggiungere 1 e -1 utilizzando il metodo
 10000001 (-1)
+00000001 (1)
si ottiene
 10000010 (-2)

Invece, utilizzando complemento a due, possiamo aggiungere

11111111 (-1)
+00000001 (1) si ottiene
 00000000 (0)

Lo stesso vale per la sottrazione.

Inoltre, se si tenta di sottrarre 4 da 6 (due numeri positivi) è possibile complemento di 2 4 e aggiungere i due insieme 6 + (-4) = 6-4 = 2

Ciò significa che sottrazione e addizione di due numeri positivi e negativi può essere fatto dallo stesso circuito nella CPU.

Per espandere su altre risposte:

In complemento a due

  • L'aggiunta è lo stesso meccanismo interi positivi semplici aggiunta.
  • Sottrazione non cambia troppo
  • Moltiplicazione troppo!

Divisione richiede un meccanismo diverso.

Tutte queste sono vere perché complemento a due è aritmetica modulare solo normale, in cui abbiamo scelto di guardare alcuni numeri come negativo sottraendo il modulo.

Leggendo le risposte a questa domanda, mi sono imbattuto in questo commento [Modificato].

  complemento di 0100

2 di (4) sarà 1100. Ora 1100 è 12 se dico normalmente. Così,   quando dico normale 1100, allora è 12, ma quando dico 2 complemento 1100 allora   è -4? Inoltre, in Java, quando 1100 (lascia supporre 4 bit per ora) viene memorizzato poi   Come si determina se si tratta di 12 o -4 ?? - hagrawal 2 luglio alle 16:53

A mio parere, la domanda posta in questo commento è molto interessante e quindi mi piacerebbe prima di tutto a riformulare e poi di fornire una risposta e un esempio.

DOMANDA - Come può il sistema di stabilire come uno o più byte adiacenti devono essere interpretati? In particolare, come può il sistema stabilire se una data sequenza di byte è un numero binario normale o complemento a 2 del?

RISPOSTA - Il sistema stabilisce come interpretare una sequenza di byte attraverso tipi. Tipi definiscono

  • quanti byte devono essere considerati
  • come quei byte devono essere interpretati

ESEMPIO - Di seguito si assume che

  • char di sono lunghi 1 byte
  • short di 2 byte sono lunghi
  • int di e float di 4 byte sono lunghi

Si prega di notare che queste dimensioni sono specifici per il mio sistema. Anche se abbastanza comune, che possono essere diverse da sistema a sistema. Se siete curiosi di ciò che sono sul vostro sistema, utilizzare la sizeof operatore .

Innanzitutto definire una matrice contenente 4 byte e inizializzare tutti al numero 10111101 binario, corrispondente al numero BD esadecimale.

// BD(hexadecimal) = 10111101 (binary)
unsigned char   l_Just4Bytes[ 4 ]   =   { 0xBD, 0xBD, 0xBD, 0xBD };

Poi si legge il contenuto array usando tipi diversi.

unsigned char e signed char

// 10111101 as a PLAIN BINARY number equals 189
printf( "l_Just4Bytes as unsigned char  -> %hi\n", *( ( unsigned char* )l_Just4Bytes ) );

// 10111101 as a 2'S COMPLEMENT number equals -67
printf( "l_Just4Bytes as signed char    -> %i\n", *( ( signed char* )l_Just4Bytes ) );

unsigned short e short

// 1011110110111101 as a PLAIN BINARY number equals 48573
printf( "l_Just4Bytes as unsigned short -> %hu\n", *( ( unsigned short* )l_Just4Bytes ) );

// 1011110110111101 as a 2'S COMPLEMENT number equals -16963
printf( "l_Just4Bytes as short          -> %hi\n", *( ( short* )l_Just4Bytes ) );

unsigned int, int e float

// 10111101101111011011110110111101 as a PLAIN BINARY number equals 3183328701
printf( "l_Just4Bytes as unsigned int   -> %u\n", *( ( unsigned int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a 2'S COMPLEMENT number equals -1111638595
printf( "l_Just4Bytes as int            -> %i\n", *( ( int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a IEEE 754 SINGLE-PRECISION number equals -0.092647
printf( "l_Just4Bytes as float          -> %f\n", *( ( float* )l_Just4Bytes ) );

I 4 byte RAM (l_Just4Bytes[ 0..3 ]) rimangono sempre esattamente lo stesso. L'unica cosa che cambia è il modo in cui li interpretiamo.

Anche in questo caso, che dire al sistema come di interpretarli attraverso tipo .

Ad esempio, sopra abbiamo utilizzato i seguenti tipi di interpretare i contenuti della matrice l_Just4Bytes

  • unsigned char: 1 byte in pianura binario
  • signed char: 1 byte in complemento a 2
  • unsigned short: 2 byte in notazione binaria pianura
  • short: 2 byte in complemento a 2
  • unsigned int: 4 byte in notazione binaria pianura
  • int: 4 byte in complemento a 2
  • float: 4 byte in IEEE 754 a precisione singola notazione

[EDIT] Questo post è stato modificato dopo il commento di user4581301. Grazie per il tempo dedicato a cadere quelle poche righe utile!

È possibile guardare il professor Jerry Cain da Stanford spiegare complemento a due, nella seconda lezione (la spiegazione per quanto riguarda complemento a 2 inizia intorno alle 13:00) nella serie di conferenze denominate paradigmi di programmazione a disposizione per guardare dal canale YouTube di Standford. Ecco il link per la serie di conferenze: http://www.youtube.com/view_play_list?p= 9D558D49CA734A02 .

complemento

di due viene utilizzato perché è più semplice da implementare in circuiti e anche non consente uno zero negativo.

Se non ci sono x bit, complemento a due sarà compreso tra + (2 ^ x / 2 + 1) a - (2 ^ x / 2). complemento a uno si svolgerà dal + (2 ^ x / 2) a -. (2 ^ x / 2), ma permetterà uno zero negativo (0000 è pari a 1000 nel sistema del complemento a 4 bit 1 del)

Bene, il vostro intento non è realmente invertire tutti i bit del vostro numero binario. In realtà è quello di sottrarre ogni sua cifra di 1. E 'solo una fortunata coincidenza che sottraendo 1 da 1 risultati in 0 e sottraendo 0 da 1 a 1. risultati bit flipping Così viene efficacemente portando avanti questa sottrazione.

Ma perché stai trovando differenza di ogni cifra da 1? Beh, non lo sei. Il vostro intento reale è quello di calcolare la differenza dato del numero binario da un altro numero binario che ha lo stesso numero di cifre, ma contiene solo 1 di. Per esempio, se il numero è 10.110.001, quando si schiaccia tutti quei bit, si sta effettivamente calcolo. (11.111.111-10.110.001)

Questo spiega il primo passo nel calcolo del complemento di due. Ora cerchiamo di includere la seconda fase - l'aggiunta di 1 -. Anche nella foto

Aggiungere 1 per l'equazione binario sopra:

11111111 - 10110001 + 1

Che cosa si ottiene? Questo:

100000000 - 10110001

Questa è l'equazione finale. E nello svolgimento di questi due passaggi si sta cercando di trovare questo, differenza finale:. Il numero binario sottratto da un altro numero binario con una cifra in più e che contengono gli zeri tranne nella posizione bit più significato

Ma perché stiamo hankerin' dopo questa differenza davvero? Bene, da qui in poi, credo che sarebbe meglio se si legge la rel="nofollow Wikipedia articolo .

Eseguiamo solo operazione di addizione sia per addizione e sottrazione. Aggiungiamo il secondo operando al primo operando per l'aggiunta. Per la sottrazione aggiungiamo complemento del secondo operando il 2 di al primo operando.

Con rappresentazione in complemento a 2 di non abbiamo bisogno di componenti digitali separate per vipere e servizi complementari sottrazione solo vengono utilizzati.

E 'interessante notare che su alcune macchine aggiungendo primi, prima dei giorni di computer digitali, sottrazione verrebbe eseguita avendo l'operatore immettere i valori utilizzando un insieme di colore diverso di leggende su ciascun tasto (in modo che ogni chiave entrerebbe nove meno il numero da sottrarre), e premere un tasto speciale sarebbe assumerebbe un riporto in un calcolo. Così, in una macchina a sei cifre, sottrarre 1234 da un valore, l'operatore avrebbe colpito tasti che normalmente indicare "998.765" e colpire un pulsante per aggiungere il valore più uno per il calcolo in corso. Due complemento di aritmetica è semplicemente l'equivalente binario di precedenza che l'aritmetica "ten's-complemento".

Il vantaggio di eseguire la sottrazione con il metodo complemento è riduzione del hardware
complexity.The sono bisogno del diverso circuito digitale per addizione e subtraction.both  addizione e sottrazione sono eseguite solo da vipera.

Il principale vantaggio della rappresentazione in complemento a due che non è ancora stata qui menzionato è che i bit inferiori di una somma in complemento a due, differenza o prodotto dipendono solo sui corrispondenti bit gli operandi. La ragione per cui il valore con segno a 8 bit per -1 è 11111111 è che sottraendo qualsiasi numero intero il cui bassi 8 bit sono 00000001 da qualsiasi altro numero intero il cui disponibilità 8 bit sono 0000000 si produrrà un numero intero il cui bassi 8 bit sono 11111111. Matematicamente, il valore -1 sarebbe una stringa infinita di 1, ma tutti i valori compresi nell'intervallo di un particolare tipo intero o sarà tutti 1 o tutti 0 di oltre un certo punto, quindi è comodo per computer di "segno-estendere" la bit più significativo di un numero come se rappresentava un numero infinito di 1 o 0 di di.

complemento a due è solo l'unica rappresentazione-numero con segno che funziona bene quando si tratta di tipi più grandi di dimensione della parola naturale di una macchina binario, dal momento che durante l'esecuzione di addizione o sottrazione, il codice può recuperare il pezzo più basso di ogni operando, calcolare la disponibilità pezzo del risultato, e negozio che, quindi caricare il blocco successivo di ogni operando, calcolare il blocco successivo del risultato, e negozio che, ecc Così, anche un processore che richiede tutte le aggiunte e sottrazioni di passare attraverso un singolo 8 registro bit in grado di gestire i numeri con segno a 32 bit ragionevolmente efficiente (più lento che con un registro a 32 bit, ovviamente, ma ancora funzionante).

Quando si usano degli eventuali altre rappresentazioni firmate consentiti dalla C standard, ogni bit del risultato potrebbe potenzialmente applicabile nessun bit degli operandi, rendendo necessario o contenere un intero valore in registri contemporaneamente oppure seguire calcoli con un passaggio aggiuntivo che, almeno in alcuni casi, richiedono la lettura, modifica e riscrivere ogni blocco del risultato.

Una risposta soddisfacente del perché two2 di complemento viene utilizzato per rappresentare i numeri negativi, piuttosto che il sistema del complemento di Uno è che                         sistema di complemento a due risolve il problema di più rappresentazioni di 0 e la necessità di end-around carry che esistono nel sistema del complemento del Uno di rappresentare numeri negativi.

Per ulteriori informazioni visitare https://en.wikipedia.org/wiki/Signed_number_representations

Per end-around-trasportare Visita https://en.wikipedia.org/wiki/End-around_carry

perché i produttori di CPU sono pigri!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top