Se hace para que la suma no necesite tener una lógica especial para tratar con números negativos. Mira el artículo en Wikipedia .
Digamos que tienes dos números, 2 y -1. En su forma "intuitiva" de representar números, serían 0010
y 1001
, respectivamente (me quedo con 4 bits para el tamaño). En la forma del complemento de dos , son 0010
y 1111
. Ahora, digamos que quiero agregarlos.
La adición del complemento a dos es muy simple. Agrega números normalmente y cualquier bit de transporte al final se descarta. Entonces se agregan de la siguiente manera:
0010
+ 1111
=10001
= 0001 (discard the carry)
0001
es 1, que es el resultado esperado de "2 + (- 1)".
Pero en su método "intuitivo", agregar es más complicado:
0010
+ 1001
= 1011
¿Cuál es -3, verdad? La adición simple no funciona en este caso. Debe tener en cuenta que uno de los números es negativo y usar 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, que requiere verificaciones adicionales en los números antes de que se puedan sumar. 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 son intuitivamente 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 con el almacenamiento de entradas de esta manera, y ahí es cuando necesita extender el ancho del registro en el que se almacena el valor. Con el complemento de dos, almacenar un número de 4 bits en un registro de 8 bits es cuestión de repetir 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 una cuestión de mirar el bit de signo de la palabra más pequeña y repetirla hasta que cubra 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 establecer esos 4 bits adicionales en ambos casos, pero en el caso "intuitivo" también necesita 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.