El complemento a uno de un número binario es el valor que se obtiene al invertir (dar la vuelta) todos los bits de la representación binaria del número. El nombre "complemento a uno" [1] se refiere al hecho de que dicho valor invertido, si se añade al original, siempre produciría un número "todos unos" (el término " complemento " se refiere a dichos pares de números inversos mutuamente aditivos , aquí con respecto a un número base distinto de 0). Esta operación matemática es de interés principalmente en informática , donde tiene distintos efectos según cómo represente los números una computadora específica.
Un sistema de complemento a uno o aritmética de complemento a uno es un sistema en el que los números negativos se representan por la inversa de las representaciones binarias de sus números positivos correspondientes. En un sistema de este tipo, un número se niega (se convierte de positivo a negativo o viceversa) calculando su complemento a uno. Un sistema de numeración de complemento a uno de N bits solo puede representar números enteros en el rango −(2 N−1 −1) a 2 N−1 −1, mientras que el complemento a dos puede expresar −2 N−1 a 2 N−1 −1. Es una de las tres representaciones comunes para números enteros negativos en computadoras binarias , junto con el complemento a dos y el signo-magnitud .
El sistema de numeración binario de complemento a uno se caracteriza porque el complemento de bits de cualquier valor entero es el negativo aritmético del valor. Es decir, invertir todos los bits de un número (el complemento lógico) produce el mismo resultado que restar el valor a 0.
Muchos de los primeros ordenadores, incluidos el UNIVAC 1101 , el CDC 160 , el CDC 6600 , el LINC , el PDP-1 y el UNIVAC 1107 , utilizaban la aritmética del complemento a uno. Los sucesores del CDC 6600 continuaron utilizando la aritmética del complemento a uno hasta finales de los años 1980, y los descendientes del UNIVAC 1107 (la serie UNIVAC 1100/2200 ) todavía lo hacen, pero la mayoría de los ordenadores modernos utilizan el complemento a dos .
Los números positivos son el mismo sistema binario simple que utilizan el complemento a dos y el signo-magnitud. Los valores negativos son el complemento de bits del valor positivo correspondiente. El valor positivo más grande se caracteriza por el bit de signo (orden superior) que está desactivado (0) y todos los demás bits que están activados (1). El valor negativo más bajo se caracteriza por el bit de signo que es 1 y todos los demás bits que son 0. La siguiente tabla muestra todos los valores posibles en un sistema de cuatro bits, desde −7 hasta +7.
+ − 0 0000 1111 — Tenga en cuenta que tanto +0 como −0 devuelven VERDADERO cuando se prueba para cero 1 0001 1110 — y FALSO cuando se prueba si es distinto de cero. 2 0010 1101 3 0011 1100 4 0100 1011 5 0101 1010 6 0110 1001 7 0111 1000
Sumar dos valores es sencillo. Simplemente hay que alinear los valores en el bit menos significativo y sumar, propagando cualquier acarreo al bit que se encuentra una posición a la izquierda. Si el acarreo se extiende más allá del final de la palabra, se dice que ha "dado la vuelta", una condición llamada " acarreo de vuelta al final ". Cuando esto ocurre, el bit debe volver a añadirse en el bit más a la derecha. Este fenómeno no ocurre en la aritmética del complemento a dos.
0001 0110 22+ 0000 0011 3=========== ==== 0001 1001 25
La resta es similar, excepto que los préstamos, en lugar de los acarreos, se propagan hacia la izquierda. Si el préstamo se extiende más allá del final de la palabra, se dice que ha "envuelto", una condición llamada " préstamo de extremo a extremo ". Cuando esto ocurre, el bit debe restarse del bit más a la derecha. Este fenómeno no ocurre en la aritmética del complemento a dos.
0000 0110 6− 0001 0011 19=========== ====1 1111 0011 −12 —Se produce un préstamo final y el bit de signo del resultado intermedio es 1.− 0000 0001 1 —Resta el préstamo final del resultado.=========== ==== 1111 0010 −13 —El resultado correcto (6 − 19 = −13)
Es fácil demostrar que el complemento de bit de un valor positivo es la magnitud negativa del valor positivo. El cálculo de 19 + 3 produce el mismo resultado que 19 − (−3).
Añade 3 a 19.
0001 0011 19+ 0000 0011 3=========== ==== 0001 0110 22
Restar -3 de 19.
0001 0011 19− 1111 1100 −3=========== ====1 0001 0111 23 —Se produce un préstamo de extremo a extremo .− 0000 0001 1 —Resta el préstamo final del resultado.=========== ==== 0001 0110 22 —El resultado correcto (19 − (−3) = 22).
El cero negativo es la condición en la que todos los bits de una palabra con signo son 1. Esto sigue las reglas del complemento a uno, según las cuales un valor es negativo cuando el bit más a la izquierda es 1 y un número negativo es el complemento de bits de la magnitud del número. El valor también se comporta como cero al realizar los cálculos. Sumar o restar un cero negativo a otro valor produce el valor original.
Añadiendo cero negativo:
0001 0110 22+ 1111 1111 −0=========== ====1 0001 0101 21 Se produce un acarreo en sentido de los extremos .+ 0000 0001 1=========== ==== 0001 0110 22 El resultado correcto (22 + (−0) = 22)
Restando cero negativo:
0001 0110 22− 1111 1111 −0=========== ====1 0001 0111 23 Se produce un préstamo de extremo a extremo .− 0000 0001 1=========== ==== 0001 0110 22 El resultado correcto (22 − (−0) = 22)
El cero negativo se produce fácilmente en un sumador de complemento a uno. Simplemente se suman los números positivos y negativos de la misma magnitud.
0001 0110 22+ 1110 1001 −22=========== ==== 1111 1111 −0 Cero negativo.
Aunque las matemáticas siempre producen los resultados correctos, un efecto secundario del cero negativo es que el software debe realizar pruebas para detectar el cero negativo.
La generación de cero negativo deja de ser un problema si la suma se logra con un restador complementario. El primer operando se pasa al restador sin modificar, el segundo operando se complementa y la resta genera el resultado correcto, evitando el cero negativo. El ejemplo anterior sumó 22 y −22 y produjo −0.
0001 0110 22 0001 0110 22 1110 1001 −22 1110 1001 −22+ 1110 1001 −22 − 0001 0110 22 + 0001 0110 22 − 1110 1001 −22=========== ==== pero =========== ==== igualmente, =========== === pero =========== === 1111 1111 −0 0000 0000 0 1111 1111 −0 0000 0000 0
Los "casos extremos" surgen cuando uno o ambos operandos son cero y/o cero negativo.
0001 0010 18 0001 0010 18− 0000 0000 0 − 1111 1111 −0=========== ==== =========== ==== 0001 0010 18 1 0001 0011 19 − 0000 0001 1 =========== ==== 0001 0010 18
Restar +0 es trivial (como se muestra arriba). Si el segundo operando es cero negativo, se invierte y el valor original del primer operando es el resultado. Restar −0 también es trivial. El resultado solo puede ser uno de dos casos. En el caso 1, el operando 1 es −0, por lo que el resultado se produce simplemente restando 1 de 1 en cada posición de bit. En el caso 2, la resta generará un valor que es 1 más grande que el operando 1 y un préstamo de fin de vuelta . Completar el préstamo genera el mismo valor que el operando 1.
El siguiente ejemplo muestra lo que sucede cuando ambos operandos son más o menos cero:
0000 0000 0 0000 0000 0 1111 1111 −0 1111 1111 −0+ 0000 0000 0 + 1111 1111 −0 + 0000 0000 0 + 1111 1111 −0=========== ==== =========== ==== =========== ==== ===== ====== ==== 0000 0000 0 1111 1111 −0 1111 1111 −0 1 1111 1110 −1 + 0000 0001 1 ================== 1111 1111 −0
0000 0000 0 0000 0000 0 1111 1111 −0 1111 1111 −0− 1111 1111 −0 − 0000 0000 0 − 1111 1111 −0 − 0000 0000 0=========== ==== =========== ==== =========== ==== ===== ====== ====1 0000 0001 1 0000 0000 0 0000 0000 0 1111 1111 −0− 0000 0001 1=========== ==== 0000 0000 0
Este ejemplo muestra que, de las cuatro condiciones posibles cuando se suman solo ±0, un sumador producirá −0 en tres de ellas. Un restador complementario producirá −0 solo cuando el primer operando sea −0 y el segundo sea 0.
Los lectores y editores de textos que se preocupan por los detalles deberían tener en cuenta la posición del apóstrofo en términos como "complemento a dos" y "complemento a unos": un número en complemento a dos se complementa con respecto a una única potencia de 2, mientras que un número en complemento a unos se complementa con respecto a una secuencia larga de 1.