¿Por qué preferir el complemento a dos al signo y magnitud para los números con signo?

Resuelto Ray asked hace 15 años • 19 respuestas

Solo tengo curiosidad por saber si hay alguna razón por la cual, para representar -1 en binario, se usa el complemento a dos: ¿voltear los bits y sumar 1?

-1 está representado por 11111111 (complemento a dos) en lugar de (para mí, más intuitivo) 10000001, que es 1 binario con el primer bit como indicador negativo.

Descargo de responsabilidad: ¡No dependo de la aritmética binaria para mi trabajo!

Ray avatar Jul 14 '09 20:07 Ray
Aceptado

Se hace para que la suma no necesite tener ninguna lógica especial para tratar con números negativos. Consulte el artículo en Wikipedia .

Digamos que tienes dos números, 2 y -1. En su forma "intuitiva" de representar números, serían 0010y 1001, respectivamente (me quedo con 4 bits de tamaño). En complemento a dos , son 0010y 1111. Ahora, digamos que quiero agregarlos.

La suma en complemento a dos es muy sencilla. Agrega números normalmente y cualquier bit de acarreo al final se descarta. Entonces se agregan de la siguiente manera:

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

0001es 1, que es el resultado esperado de "2+(-1)".

Pero en su método "intuitivo", sumar es más complicado:

  0010
+ 1001
= 1011

Cuál es -3, ¿verdad? La simple suma no funciona en este caso. Debes tener en cuenta que uno de los números es negativo y utilizar un algoritmo diferente si ese es el caso.

Para este método de almacenamiento "intuitivo", la resta es una operación diferente a la suma, lo que requiere comprobaciones adicionales de los números antes de poder sumarlos. Dado que desea que las operaciones más básicas (suma, resta, etc.) sean lo más rápidas posible, debe almacenar los números de una manera que le permita utilizar los algoritmos más simples posibles.

Además, en el método de almacenamiento "intuitivo", hay dos ceros:

0000  "zero"
1000  "negative zero"

Que intuitivamente son el mismo número pero tienen dos valores diferentes cuando se almacenan. Cada aplicación deberá tomar medidas adicionales para asegurarse de que los valores distintos de cero tampoco sean cero negativo.

Hay otra ventaja al almacenar enteros de esta manera, y es entonces cuando necesitas ampliar el ancho del registro en el que se almacena el valor. Con el complemento a dos, almacenar un número de 4 bits en un registro de 8 bits es cuestión de repetir su parte más significante:

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

Es solo cuestión de mirar el signo de la palabra más pequeña y repetirlo hasta que ocupe el ancho de la palabra más grande.

Con su método necesitaría borrar el bit existente, que es una operación adicional además del relleno:

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

Aún necesita configurar esos 4 bits adicionales en ambos casos, pero en el caso "intuitivo" también debe borrar el quinto bit. Es un pequeño paso adicional en una de las operaciones más fundamentales y comunes presentes en cada aplicación.

Welbog avatar Jul 14 '2009 13:07 Welbog

Wikipedia lo dice todo:

El sistema en complemento a dos tiene la ventaja de no requerir que los circuitos de suma y resta examinen los signos de los operandos para determinar si se deben sumar o restar. Esta propiedad hace que el sistema sea más sencillo de implementar y capaz de manejar fácilmente aritmética de mayor precisión. Además, el cero tiene una sola representación, obviando las sutilezas asociadas con el cero negativo, que existe en los sistemas en complemento a uno.

En otras palabras, sumar es lo mismo, sea negativo o no.

Yacoby avatar Jul 14 '2009 13:07 Yacoby

Aunque esta pregunta es antigua, permítanme aportar mi granito de arena.

Antes de explicar esto, volvamos a lo básico. El complemento a 2' es el complemento a 1 + 1. Ahora bien, ¿qué es el complemento a 1 y cuál es su significado además?

La suma de cualquier número de n bits y su complemento a 1 da el número más alto posible que puede ser representado por esos n bits. Ejemplo:

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

Ahora, ¿qué pasará si intentamos agregar 1 más al resultado? Dará como resultado un desbordamiento.

El resultado será 1 00000 (ya que estamos trabajando con números de 4 bits, (el 1 de la izquierda es un desbordamiento)

Entonces ,

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)

Entonces alguien decidió llamar complemento a 1 + 1 como complemento a 2. Entonces la declaración anterior se convierte en: Cualquier número de n'bits + su complemento a 2 = 0, lo que significa complemento a 2 de un número = - (de ese número)

Todo esto genera una pregunta más, ¿por qué podemos usar solo el (n-1) de los n bits para representar un número positivo y por qué el enésimo bit más a la izquierda representa el signo (0 en el bit más a la izquierda significa +ve número y 1 significa -ve número). por ejemplo, ¿por qué usamos solo los primeros 31 bits de un int en Java para representar un número positivo si el bit 32 es 1, es un número -ve?

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

1 0000 (el resultado es cero, con el acarreo 1 desbordado)

Por lo tanto, el sistema de (n + complemento 2 de n) = 0 todavía funciona. La única ambigüedad aquí es que el complemento a 2 de 12 es 0100, que también representa ambiguamente +8, además de representar -12 en el sistema de complemento a 2.

Este problema se resolverá si los números positivos siempre tienen un 0 en el bit más a la izquierda. En ese caso, su complemento a 2 siempre tendrá un 1 en el bit más a la izquierda, y no tendremos la ambigüedad de que el mismo conjunto de bits represente un número en complemento a 2 y un número +ve.

Rpant avatar Jun 14 '2014 14:06 Rpant