¿Cuáles son las ventajas del complemento de dos?

11

En algunos dispositivos ADC / DAC, hay opciones para generar / ingresar los datos en el formulario Complemento de 2.

¿Cuáles son las ventajas de representar datos digitales en el formulario Complemento de dos cuando simplemente puede tener un código binario directo y ahorrar tiempo de conversión?

rahulb
fuente
44
El cumplido de Two es un código binario directo ...
Mooing Duck
"El álgebra se ejecuta en una máquina (el universo) que es un complemento de dos" - HAKMEM 154 ( inwap.com/pdp10/hbaker/hakmem/hacks.html )
ChrisInEdmonton
2
¿Qué es el complemento 5 en dos? 101. ¿Qué es 5 en código binario directo? 101. ¿Qué es -5 en el complemento a dos? 1 ... 11111011. ¿Qué es -5 en código binario directo? Uhh ...
user253751
¿Parece un caso especial raro tener un ADC con salida negativa? ¿Qué significa eso, incluso, que el voltaje medido es más bajo que el voltaje bajo de referencia? ¿Y cómo construirías tal ADC? ¿Aproximación sucesiva con tapas que tienen una carga negativa ...?
Lundin
Tenga en cuenta que hay dos palabras diferentes , cumplido y cumplido . El tema aquí es un cumplido de dos , incluso si esos dos son muy educados y a menudo dicen cosas buenas de ti.
Pete Becker

Respuestas:

11

La representación complementaria de Two de enteros con signo es fácil de manipular en hardware. Por ejemplo, la negación (es decir, x = -x ) puede realizarse simplemente volteando todos los bits en el número y sumando uno. Realizar la misma operación en binario sin formato (por ejemplo, con un bit de signo) generalmente implica mucho más trabajo, porque debe tratar ciertos bits en la secuencia como especiales. Lo mismo ocurre con la suma: la operación de suma para números negativos es idéntica a la operación de suma para números positivos, por lo que no se requiere lógica adicional (sin juego de palabras) para manejar el caso negativo.

Si bien esto no significa que sea más fácil desde su perspectiva, como consumidor de estos datos, disminuye el esfuerzo de diseño y la complejidad del dispositivo, lo que presumiblemente lo hace más barato.

Polinomio
fuente
1
Voltear bits y luego agregar 1 para negar, ¿no?
Scott Seidman
2
@ScottSeidman Sí, lo siento, olvidé esa parte. Editado para arreglar :)
Polynomial
1
En realidad, para una preparación máxima, dependiendo del procesador, puede ser un solo ciclo para tomar x = x * -1, o x = 0 - x , frente a al menos dos ciclos para x = ~ x + 1
markt
@markt Sí, pero si solo está implementando un dispositivo mínimo (es decir, no un procesador completo), entonces tiene sentido reducir la complejidad del silicio al mínimo.
Polynomial
55
+1 Además, el complemento de dos solo tiene un valor único para 0. Otros (como el complemento de uno o el bit de signo) terminan teniendo dos
sbell
5

El ADC puede convertir datos (digamos voltajes de entrada entre 0 y 5V) y usted necesita que esos datos no estén firmados (0V = 0, 5V = código máximo) o firmados (2.5V = 0, 0V = max -ve, 5V = max + ve).

Además de que el complemento de 2 es la representación de computadora más común para datos firmados, la conversión entre los dos formatos descritos anteriormente es completamente trivial: ¡simplemente invierta el MSB!

Esto es increíblemente barato de agregar a la lógica interna del ADC y le da al ADC otro punto de venta en la hoja de datos ...

Brian Drummond
fuente
Acabo de agregar el cambio de MSB entre el complemento de dos y el binario offset como un comentario a continuación
Scott Seidman,
3

Si necesita realizar cálculos matemáticos en las representaciones de números negativos, dos complementos lo hacen más fácil que el binario offset, que coincidirá con el tipo de datos "firmado int". Su compilador simplemente sabrá cómo manejarlo. De lo contrario, pasas tics de reloj convirtiendo de un lado a otro.

Scott Seidman
fuente
1

En la pregunta, parece estar implícito que el ADC tarda más en devolver el valor en forma de complemento a 2 que en binario directo. Si bien este podría ser el caso en alguna implementación particular de un ADC, no es cierto en general (por ejemplo, la serie MSP430 de microcontroladores tiene un periférico ADC en el chip que informará el valor en binario directo o complemento de 2, pero toma el mismo número de ciclos en ambos casos).

Con eso fuera del camino, la elección entre el complemento de 2 y el binario directo se debe principalmente a cómo funcionan sus transductores y a cómo le gusta procesar sus datos.

En modo binario directo, el ADC le proporciona un número que representa la relación entre la magnitud de la cantidad analógica medida (casi siempre voltaje) y la cantidad de referencia a escala completa. Por ejemplo, un ADC de 10 bits puede devolver valores de 0 a 1023 (inclusive). Si mide un voltaje (digamos, 1.25 voltios) que es la mitad del voltaje de referencia del ADC (digamos, 2.50 voltios), el código binario que lea será la mitad del valor máximo que podría leer, por lo tanto, 512 o más, sujeto a redondeo y no linealidades en el ADC.

Por ejemplo, supongamos que tiene un transductor que informa la cantidad de combustible de cohete en un tanque. 0V significa que el tanque está vacío y 2.5V Voltios significa que está lleno. ¡Tan solo conecte el transductor a su ADC y listo!

Pero tenga en cuenta que en el párrafo anterior, no hay forma de medir voltajes negativos. ¿Qué pasaría si quisiéramos medir el flujo de combustible del cohete dentro y fuera del tanque (y tuviéramos un transductor para hacerlo)? El ADC no puede medir números negativos, por lo que tenemos un problema. Sin embargo, hay una manera fácil de simularlo usando el modo de complemento a 2: en este caso, la salida del transductor se polariza de manera que el punto cero esté a medio camino entre los dos voltajes de referencia del ADC. En otras palabras, los flujos positivos están representados por voltajes entre 1.25V y 2.50V, y los flujos negativos están representados por 1.25V a 0V, por lo que los flujos hacia el tanque darán códigos ADC de 512 a 1023 y los flujos fuera del agradecimiento darán códigos de 511 a 0 (en formato binario directo).

Ahora eso es terriblemente inconveniente. Tenemos que restar 512 de cada medición antes de hacer algo con ella, lo que da números en el rango de -512 a +511. ¡El punto del modo de complemento de 2 es que hace esto por ti!

Sin embargo, es posible que desee utilizar binario directo con un transductor que produzca resultados firmados. Por ejemplo, su transductor podría tener salidas diferenciales: en este caso, desearía restar la salida invertida de la salida no invertida de todos modos, por lo que no hay ninguna ventaja en usar el complemento de 2.

nick g
fuente
1

El sistema complementario de los dos está en uso, porque se deriva de cómo funciona naturalmente el hardware simple. Piense, por ejemplo, en el odómetro de su automóvil, que ha restablecido a cero. Luego ponga la marcha atrás y conduzca hacia atrás durante 1 milla (no haga esto en realidad). Su odómetro (si es mecánico) rodará de 0000 a 9999. El sistema de complemento de los dos se comporta de manera similar.

ingrese la descripción de la imagen aquí


Tenga en cuenta que realmente no estoy ofreciendo ninguna información nueva aquí, solo el ejemplo del odómetro que alguien podría encontrar útil: me ayudó a comprender la lógica del sistema de complemento a dos cuando era joven. Después de eso, fue fácil para mí aceptar intuitivamente que los sumadores, sustractores, etc. funcionan bien con el sistema de complemento de dos.

Y sí, el odómetro de mi Nissan funciona de esta manera.

PkP
fuente
Su respuesta es sobre el desbordamiento (o por defecto), pero dado que el odómetro no muestra números negativos, no se ocupa de todo lo relacionado con dos de complemento ...
marcelm
@marcelm, en realidad, el ejemplo odómetro hace explicar complemento a dos. Es solo que PkP no fue lo suficientemente lejos con la explicación. Si un odómetro de seis dígitos lee cero, y usted maneja en reversa por una milla, entonces esperaría que lea -1. En cambio, se lee 999999. Eso se debe a que 999999 es la representación de seis dígitos y decenas de complemento de -1.
Solomon Slow
@jameslarge No, todavía no lo hace. No hay nada en la respuesta que realmente toque el complemento de dos. O el complemento de uno, o la magnitud del signo, o cualquier representación de número con signo.
marcelm
@marcelm Sí, existe: la idea central del sistema del complemento a dos: que cero menos uno es igual al número entero máximo sin signo representable. Esa es la idea del sistema de complemento a dos. Ninguna otra representación de número firmado ofrece esto (que yo sepa). Y el ejemplo del odómetro muestra cuán naturalmente esta propiedad de comportamiento proviene de la simplicidad de la ingeniería; en el caso del odómetro: de ingeniería mecánica. Tanto en el mundo mecánico como en el electrónico, (el sistema de complemento a dos) es la forma más sencilla de hacerlo funcionar.
PkP
0

Otros ya han respondido por qué dos binarios complementarios son convenientes para el hardware de la computadora. Sin embargo, parece que se pregunta por qué un A / D generaría dos cumplidos en lugar de "binario directo" (lo que usted piense que realmente significa).

La mayoría de los A / D generan un valor binario simple sin signo que varía de 0 a 2 N -1, donde N es el número de bits a los que se convierte el A / D. Tenga en cuenta que esto también podría considerarse dos notación complementaria, solo que los valores nunca son negativos. Si solo se trata de números positivos, la mayoría de las representaciones binarias son iguales. Esto incluye dos cumplidos y signos de magnitud.

Algunos A / D, particularmente aquellos integrados en microcontroladores, tienen la opción de producir valores negativos para la mitad inferior de su rango. Esto puede ser una ventaja percibida cuando se mide una señal bipolar.

Al menos en un microcontrolador, esto es generalmente tonto. En algunos casos, puede usar los valores A / D directamente sin ninguna conversión. En ese caso, ya ha convertido todos los demás valores al rango A / D. Restringir eso a todos los números no negativos en realidad simplifica las cosas.

De lo contrario, aplicará algo de escala y compensación a las lecturas A / D de todos modos para obtenerlas en las unidades que use para los valores internos. Una vez más, no hay inconveniente en los valores sin signo que salen directamente de A / D. De hecho, generalmente aplico un filtrado de paso bajo en los valores sin procesar antes de cualquier escala y desplazamiento. Saber que esos valores nunca serán negativos simplifica un poco los cálculos. Hacer la escala en valores sin signo también hace las cosas un poco más simples a veces.

No recuerdo un solo caso en más de 100 proyectos de microcontroladores en los que utilicé A / D en otro formato que no sea el de salida sin firmar.

Entonces, para responder a la pregunta de cuáles son las ventajas de un A / D que genera "dos cumplidos", hay dos respuestas:

  1. Todos lo hacen de todos modos, solo que la mayoría de las veces estos valores no son negativos, por lo que no puede distinguir la diferencia entre dos cumplidos y otras notaciones, como la magnitud de los signos.

  2. Las ventajas son muy leves. Dentro de un microcontrolador son esencialmente inexistentes.

    En hardware dedicado, puede haber alguna ventaja en tener valores negativos que indiquen voltaje de entrada negativo, en cuyo caso dos cumplidos son la forma más fácil de lidiar con el rango de valores. Tenga en cuenta que si el rango de voltaje de entrada no es simétrico con respecto a 0, esta ventaja desaparece.

Olin Lathrop
fuente
-1

¿De qué habla este 'código binario directo'? Supongo que te refieres a tener un bit de signo que es '1' para negativo y '0' para positivo (o viceversa ). Esto tiene dos desventajas más sobre dos complementos que aún no se han mencionado: uno en gran medida irrelevante en estos días y otro importante.

El más irrelevante es que puede representar un número menos, es decir, 255 números en 8 bits. Esto es bastante irrelevante cuando tienes 32 o 64 bits pero importa cuando tienes tan solo 4 o 6 bits para trabajar.

La más importante es que ahora hay dos formas de representar el mismo número: específicamente, 0 - +0 y -0 pero +0 y -0 son el mismo número, por lo que su implementación debe asegurarse de no compararlos. números cada vez que haces una verificación de igualdad.

Jack Aidley
fuente
Creo que estás fuera de pista aquí. Estás hablando de una representación de magnitud de signo cuando el OP hablaba claramente de una representación binaria sin signo.
Joe Hass
1
Si está hablando de una representación sin signo, entonces no hay ventaja para el complemento de Two. Simplemente desperdicia un poco.
Jack Aidley