Quali sono i vantaggi del complemento a due?


11

In alcuni dispositivi ADC / DAC sono disponibili opzioni per l'output / input dei dati nel modulo Complemento 2.

Quali sono i vantaggi di rappresentare i dati digitali nel modulo del complemento di Two Quando puoi semplicemente avere un codice binario diretto e risparmiare tempo di conversione?


4
Il complimento di Two è un semplice codice binario ...
Mooing Duck

"Algebra viene eseguita su una macchina (l'universo) che è un complemento a due" - HAKMEM 154 ( inwap.com/pdp10/hbaker/hakmem/hacks.html )
ChrisInEdmonton

2
Qual è il complemento di 5 in due? 101. Che cos'è 5 in codice binario dritto? 101. Che cosa è -5 nel complemento a due? 1 ... 11.111.011. Cosa è -5 nel codice binario diretto? Uhh ...
user253751

Sembra un raro caso speciale di avere un ADC con uscita negativa? Cosa significa anche che la tensione misurata è inferiore al riferimento basso di tensione? E come costruiresti un simile ADC? Approssimazione successiva con tappi che hanno un carico negativo ...?
Lundin,

Nota che ci sono due parole diverse , complEment e complIment . L'argomento qui è il complimento per due , anche se quei due sono molto educati e spesso dicono cose carine su di te.
Pete Becker,

Risposte:


11

La rappresentazione complimentale di due di numeri interi firmati è facile da manipolare nell'hardware. Ad esempio, la negazione (cioè x = -x ) può essere eseguita semplicemente capovolgendo tutti i bit nel numero e aggiungendone uno. L'esecuzione della stessa operazione in binario non elaborato (ad es. Con un bit di segno) di solito comporta molto più lavoro, poiché è necessario considerare determinati bit nel flusso come speciali. Lo stesso vale per l'aggiunta - l'operazione di aggiunta per i numeri negativi è identica all'operazione di aggiunta per i numeri positivi, quindi non è necessaria alcuna logica aggiuntiva (nessun gioco di parole) per gestire il caso negativo.

Sebbene ciò non significhi che è più facile dal tuo punto di vista, in quanto consumatore di questi dati, riduce lo sforzo di progettazione e la complessità del dispositivo, presumibilmente rendendolo più economico.


1
Lanciando i bit quindi aggiungendo 1 per negare, no ??
Scott Seidman,

2
@ScottSeidman Sì, scusa, ho dimenticato quel pezzetto. Modificato per risolvere :)
Polynomial

1
In realtà, per la massima delicatezza, a seconda del processore può essere necessario un singolo ciclo per prendere x = x * -1 o x = 0 - x , rispetto ad almeno due cicli per x = ~ x + 1
markt

@markt Sì, ma se stai implementando solo un dispositivo minimale (cioè non un processore completo), ha senso ridurre al minimo la complessità del silicio.
Polinomio

5
+1 Inoltre, il complemento di Due ha un solo valore per 0. Altri (come il complemento o il bit di segno) finiscono per avere due
sbell

5

L'ADC può convertire i dati (ad esempio tensioni di ingresso comprese tra 0 e 5 V) e entrambi i dati devono essere senza segno (0 V = 0, 5 V = codice massimo) o firmati (2,5 V = 0, 0 V = max -ve, 5 V = max + ve).

Oltre al fatto che il complemento di 2 è la rappresentazione del computer più comune per i dati firmati, la conversione tra i due formati sopra descritti è completamente banale: basta invertire il MSB!

Questo è incredibilmente economico da aggiungere alla logica interna dell'ADC e fornisce all'ADC un altro punto di forza sul foglio dati ...


Ho appena aggiunto il passaggio MSB tra complemento a due e binario offset come commento qui sotto
Scott Seidman

3

Se è necessario eseguire calcoli matematici sulle rappresentazioni di numeri negativi, il complemento a due semplifica il binario di offset, che corrisponderà al tipo di dati "con segno int". Il tuo compilatore saprà semplicemente come gestirlo. Altrimenti, si spendono i tick di clock per la conversione avanti e indietro.


1

Nella domanda, sembra implicito che l'ADC impiega più tempo a restituire il valore nella forma del complemento di 2 rispetto al binario semplice. Mentre questo potrebbe essere il caso in una particolare implementazione di un ADC, non è vero in generale (ad esempio i microcontrollori serie MSP430 hanno una periferica ADC su chip che riporterà il valore in binario dritto o complemento di 2, ma esso richiede lo stesso numero di cicli in entrambi i casi).

A parte questo, la scelta tra il complemento di 2 e il binario semplice dipende principalmente dal funzionamento dei trasduttori e dal modo in cui ti piace elaborare i tuoi dati.

In modalità binaria diretta, ADC fornisce un numero che rappresenta il rapporto tra l'entità della quantità analogica misurata (praticamente sempre la tensione) e la quantità di riferimento a fondo scala. Ad esempio, un ADC a 10 bit può restituire valori compresi tra 0 e 1023 (inclusi). Se si misura una tensione (ad esempio 1,25 volt) che è la metà della tensione di riferimento dell'ADC (ad esempio 2,50 volt), il codice binario che si legge sarà la metà del valore massimo che è possibile leggere, quindi 512 o più, soggetto ad arrotondamenti e non linearità nell'ADC.

Ad esempio, supponiamo che tu abbia un trasduttore che riporta la quantità di combustibile per missili in un serbatoio. 0 V indica che il serbatoio è vuoto e 2,5 V Volt indica che è pieno. Quindi basta collegare il trasduttore all'ADC e il gioco è fatto!

Si noti che nel paragrafo precedente non è possibile misurare tensioni negative. E se volessimo misurare il flusso di carburante per missili in entrata e in uscita dal serbatoio (e avessimo un trasduttore per farlo)? L'ADC non può misurare numeri negativi, quindi abbiamo un problema. Tuttavia, esiste un modo semplice per simularlo utilizzando la modalità complemento di 2: in questo caso, l'uscita del trasduttore viene ridimensionata in modo che il punto zero sia a metà strada tra le due tensioni di riferimento dell'ADC. In altre parole, i flussi positivi sono rappresentati da tensioni tra 1,25 V e 2,50 V, mentre i flussi negativi sono rappresentati da 1,25 V a 0 V, quindi i flussi nel serbatoio daranno codici ADC da 512 a 1023 e i flussi in uscita daranno il ringraziamento codici da 511 a 0 (in formato binario dritto).

Ora è terribilmente scomodo. Dobbiamo sottrarre 512 da ogni misura prima di fare qualsiasi cosa con essa, che fornisce numeri nell'intervallo da -512 a +511. Il punto della modalità complemento di 2 è che lo fa per te!

Tuttavia, potresti comunque voler usare il binario dritto con un trasduttore che produce risultati firmati. Ad esempio, il trasduttore potrebbe avere uscite differenziali: in questo caso si vorrebbe sottrarre comunque l'uscita invertita dall'uscita non invertita, quindi non c'è alcun vantaggio nell'usare il complemento di 2.


1

Il sistema del complemento a due è in uso, perché deriva da come funziona l'hardware semplice. Pensa ad esempio al contachilometri della tua auto, che hai reimpostato a zero. Quindi metti la marcia indietro e guida indietro per 1 miglio (per favore non farlo in realtà). Il contachilometri (se è meccanico) passerà da 0000 a 9999. Il sistema del complemento a due si comporta in modo simile.

inserisci qui la descrizione dell'immagine


Si prega di notare che non sto davvero offrendo alcuna nuova informazione qui, solo l'esempio del contachilometri che qualcuno potrebbe trovare utile - mi ha aiutato a capire la logica del sistema del complemento di due quando ero giovane. Dopodiché, è stato facile per me accettare intuitivamente che additivi, sottrattori ecc funzionino bene con il sistema di complementi a due.

E sì, il contachilometri della mia Nissan funziona in questo modo.


La tua risposta riguarda overflow (e underflow), ma dal momento che il contachilometri non mostra numeri negativi, non affronta nulla dei due relativi al complemento ...
marcelm

@marcelm, In realtà, l'esempio del contachilometri fa spiegare complemento a due. È solo che PkP non è andato abbastanza lontano con la spiegazione. Se un contachilometri a sei cifre indica zero e si guida in retromarcia per un miglio, allora ci si aspetterebbe che legga -1. Invece, legge 999999. Questo perché 999999 è la rappresentazione del complemento a decine di sei cifre di -1.
Solomon Slow,

@jameslarge No, non è ancora così. Non c'è nulla nella risposta che tocchi effettivamente il complemento di due. O il proprio complemento, la grandezza del segno o qualsiasi rappresentazione numerica firmata.
marcelm,

@marcelm Sì, c'è: l'idea fondamentale del sistema del complemento a due: quello zero meno uno equivale al numero intero senza segno massimo rappresentabile. Questa è l'idea del sistema di complemento a due. Nessun'altra rappresentazione numerica firmata offre questo (per quanto ne sappia). E l'esempio del contachilometri mostra come questa proprietà comportamentale derivi naturalmente dalla semplicità dell'ingegneria; nel caso del contachilometri: dall'ingegneria meccanica. Sia nel mondo meccanico che in quello elettronico, (il sistema a complemento a due) è il modo più semplice per farlo funzionare.
PkP

0

Altri hanno già risposto al motivo per cui il binario a due complimenti è conveniente per l'hardware del computer. Tuttavia, sembra che ti stia chiedendo perché un A / D avrebbe prodotto due complimenti invece di "binario semplice" (qualunque cosa tu pensi significhi davvero).

La maggior parte degli A / D emette un semplice valore binario senza segno che varia da 0 a 2 N -1, dove N è il numero di bit in cui converte A / D. Nota che questo potrebbe anche essere considerato come una notazione di complimenti, solo che i valori non sono mai negativi. Se hai a che fare solo con numeri positivi, la maggior parte delle rappresentazioni binarie sono le stesse. Ciò include due complimenti e magnitudine del segno.

Alcuni A / D, in particolare quelli integrati nei microcontrollori, hanno la possibilità di produrre valori negativi per la metà inferiore del loro intervallo. Questo può essere un vantaggio percepito quando si misura un segnale bipolare.

Almeno in un microcontrollore, questo è generalmente sciocco. In alcuni casi è possibile utilizzare i valori A / D direttamente senza alcuna conversione. In tal caso, hai già convertito tutti gli altri valori nell'intervallo A / D. Limitare ciò a tutti i numeri non negativi semplifica le cose.

Altrimenti, applicherai comunque un po 'di ridimensionamento e offset alle letture A / D per portarle in qualunque unità usi per i valori internamente. Anche in questo caso non vi è alcun aspetto negativo per i valori non firmati che escono direttamente dall'A / D. In effetti, di solito applico alcuni filtri passa-basso sui valori grezzi prima di qualsiasi ridimensionamento e offset. Conoscere quei valori non sarà mai negativo semplifica leggermente i calcoli. Fare il ridimensionamento su valori non firmati rende le cose un po 'più semplici a volte.

Non ricordo un singolo caso in oltre 100 progetti di microcontrollori in cui ho usato l'A / D in un formato di output diverso da quello senza segno.

Quindi, per rispondere alla domanda su quali siano i vantaggi di un A / D che emette "due complimenti", ci sono due risposte:

  1. Lo fanno tutti comunque, solo che il più delle volte questi valori non sono negativi, quindi non si può dire la differenza tra due complimenti e altre notazioni, come la grandezza del segno.

  2. I vantaggi sono molto lievi. All'interno di un microcontrollore sono essenzialmente inesistenti.

    Nell'hardware dedicato, ci possono essere alcuni vantaggi nell'avere valori negativi che indicano una tensione di ingresso negativa, nel qual caso il complimento a due è il modo più semplice per gestire l'intervallo di valori. Si noti che se l'intervallo della tensione di ingresso non è simmetrico di circa 0, questo vantaggio scompare.


-1

Cos'è questo "codice binario diretto" di cui parli? Presumo che tu intenda avere un bit di segno che è '1' per negativo e '0' per positivo (o viceversa ). Ciò ha altri due svantaggi rispetto a due complementi che non sono ancora stati menzionati: uno in gran parte irrilevante in questi giorni e uno importante.

Quello in gran parte irrilevante è che puoi rappresentare un numero in meno - cioè 255 numeri in 8 bit. Questo è abbastanza irrilevante quando hai 32 o 64 bit ma importa quando hai a disposizione solo 4 o 6 bit.

Il più importante è che ora ci sono due modi per rappresentare lo stesso numero - in particolare, 0 - +0 e -0 ma +0 e -0 sono lo stesso numero, quindi l'implementazione deve assicurarsi che non si stiano confrontando questi numeri ogni volta che fai un controllo di uguaglianza.


Penso che tu sia fuori strada qui. Stai parlando di una rappresentazione di grandezza dei segni quando l'OP parlava chiaramente di una rappresentazione binaria senza segno.
Joe Hass,

1
Se stai parlando di una rappresentazione non firmata, non vi è alcun vantaggio nel complemento di Two. Semplicemente spreca un po '.
Jack Aidley,
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.