12 votos

¿Qué ventajas tiene el complemento a dos?

En algunos dispositivos ADC/DAC existen opciones para la salida/entrada de datos en forma de complemento a 2.

¿Cuáles son las ventajas de representar los datos digitales en forma de Complemento a Dos cuando se puede tener simplemente un código binario directo y ahorrar tiempo de conversión?

5 votos

El cumplido de dos es un código binario directo...

0 votos

"El álgebra se ejecuta en una máquina (el universo) que es complemento de dos" - HAKMEM 154 ( inwap.com/pdp10/hbaker/hakmem/hacks.html )

3 votos

¿Cuánto es 5 en complemento a dos? 101. ¿Cuánto es 5 en código binario directo? 101. ¿Qué es -5 en complemento a dos? 1...11111011. ¿Qué es -5 en código binario directo? Uhh...

12voto

abby hairboat Puntos 130

La representación de los enteros con signo en el complemento a dos es fácil de manipular en hardware. Por ejemplo, la negación (es decir x = -x ) puede realizarse simplemente volteando todos los bits del número y sumando uno. Realizar la misma operación en binario crudo (por ejemplo, con un bit de signo) suele implicar mucho más trabajo, porque hay que tratar ciertos bits del flujo 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 (no es un juego de palabras) para manejar el caso negativo.

Aunque esto no significa que sea más fácil desde tu punto de vista, como consumidor de estos datos, sí disminuye el esfuerzo de diseño y la complejidad del dispositivo, con lo que presumiblemente resulta más barato.

1 votos

Volteando bits y luego sumando 1 para negar, ¿no?

2 votos

@ScottSeidman Sí, lo siento, olvidé esa parte. Editado para arreglarlo :)

1 votos

En realidad, para la máxima picardía, 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

5voto

Brian Drummond Puntos 27798

El ADC puede convertir datos (digamos voltajes de entrada entre 0 y 5V) y usted necesita que esos datos sean sin signo (0V=0, 5V=código máximo) o con signo (2.5V=0, 0V=máx -ve, 5V=máx +ve).

Además de que el complemento a 2 es la representación informática más común para los datos con signo, la conversión entre los dos formatos descritos anteriormente es completamente trivial: basta con invertir el MSB.

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

0 votos

Acabo de añadir el cambio MSB entre complemento a dos y offset binario como comentario a continuación

3voto

shash Puntos 668

Si necesita realizar operaciones matemáticas con las representaciones de números negativos, el complemento a dos lo hace más fácil que el binario con signo, que coincidirá con el tipo de datos "signed int". Su compilador simplemente sabrá cómo manejarlo. De lo contrario, perderás tiempo convirtiendo de un lado a otro.

1voto

Jason Medeiros Puntos 2549

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. Aunque 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á del valor en binario directo o complemento a 2, pero tarda el mismo número de ciclos en ambos casos).

Una vez aclarado esto, la elección entre el complemento a 2 y el binario directo depende sobre todo de cómo funcionen los transductores y de cómo te guste procesar los 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 (prácticamente siempre tensión) y la cantidad de referencia a escala completa. Por ejemplo, un ADC de 10 bits puede devolver valores de 0 a 1023 (ambos inclusive). Si mide una tensión (digamos, 1,25 voltios) que es la mitad de la tensión de referencia del ADC (digamos, 2,50 voltios), el código binario que leerá será la mitad del valor máximo que podría leer, es decir, 512, o aproximadamente, sujeto al redondeo y a las no linealidades del ADC.

Por ejemplo, supongamos que tiene un transductor que informa de la cantidad de combustible para cohetes que hay en un depósito. 0V significa que el tanque está vacío y 2,5V voltios significa que está lleno. Así que sólo tienes que conectar el transductor a tu ADC, ¡y listo!

Pero fíjate que en el párrafo anterior no hay forma de medir tensiones negativas. ¿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, así que tenemos un problema. Sin embargo, hay una forma fácil de falsearlo utilizando el modo de complemento a 2: En este caso, la salida del transductor se polariza para que el punto cero esté a medio camino entre las dos tensiones de referencia del ADC. En otras palabras, los flujos positivos están representados por tensiones entre 1,25V y 2,50V, y los flujos negativos están representados por 1,25V a 0V - por lo que los flujos en el tanque darán códigos ADC de 512 a 1023 y los flujos fuera de la gracias dará códigos de 511 a 0 (en formato binario recto).

Eso sí que es un inconveniente. Tenemos que restar 512 a cada medida antes de hacer nada con ella, lo que da números en el rango de -512 a +511. El punto del modo complemento a 2 es que ¡lo hace por ti!

Sin embargo, es posible que aún desee utilizar binario directo con un transductor que produzca resultados con signo. Por ejemplo, su transductor puede tener salidas diferenciales: En este caso, es preferible restar la salida invertida de la salida no invertida, por lo que no hay ninguna ventaja en utilizar el complemento a 2.

1voto

Dror Puntos 745

El sistema de complemento a dos está en uso, porque se deriva de cómo funciona naturalmente el hardware simple. Piensa, por ejemplo, en el cuentakilómetros de tu coche, que has puesto a cero. A continuación, pon la marcha atrás y conduce hacia atrás durante 1 milla (por favor, no hagas esto en la realidad). Su cuentakilómetros (si es mecánico) pasará de 0000 a 9999. El sistema de complemento a dos se comporta de forma similar.

enter image description here


Tenga en cuenta que en realidad no estoy ofreciendo ninguna información nueva aquí, sólo el ejemplo del cuentakilómetros que alguien podría encontrar útil - me ayudó a entender el fundamento del sistema de complemento a dos cuando era joven. Después de eso, me resultó fácil aceptar intuitivamente que los sumadores, restadores, etc. funcionan bien con el sistema de complemento a dos.

Y sí, el cuentakilómetros de mi Nissan funciona así.

0 votos

Tu respuesta trata sobre el desbordamiento (y el desbordamiento por defecto), pero como el cuentakilómetros no muestra números negativos, no trata nada relacionado con dos complementos...

0 votos

@marcelm, En realidad, el ejemplo del cuentakilómetros hace explicar el complemento a dos. Es sólo que PkP no fue lo suficientemente lejos con la explicación. Si un cuentakilómetros de seis dígitos marca cero, y conduces marcha atrás durante una milla, lo normal es que marque -1. En cambio, marca 999999. Eso es porque 999999 es la representación de seis dígitos, complemento de las decenas, de -1.

0 votos

@jameslarge No, todavía no. No hay nada en la respuesta que toque realmente el complemento a dos. O complemento a uno, o signo-magnitud, o cualquier representación numérica con signo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X