El complemento a dos ( a veces " complemento a dos " ) es la forma más común de representar números enteros negativos en las computadoras . Le permite reemplazar la operación de resta con la operación de suma y hacer que las operaciones de suma y resta sean las mismas para números con y sin signo , lo que simplifica la arquitectura de la computadora . En la literatura inglesa, el " código inverso " se denomina " complemento de unos" , y el "código adicional" se denomina " complemento de dos" .
Se puede obtener un código adicional para un número negativo invirtiendo su módulo binario y sumando uno a la inversión, o restando el número de cero.
El código de complemento a dos se define como el valor obtenido al restar el número de la mayor potencia de dos (de 2 N para complemento de segundo de N bits).
Al escribir un número en un código adicional, el bit más significativo es un signo. Si el valor del bit más significativo es 0, significa que los bits restantes contienen un número binario positivo que coincide con el código directo .
Un número binario de 8 bits con signo en complemento a dos puede representar cualquier número entero entre −128 y +127 . Si el bit más significativo es cero, entonces el entero más grande que se puede escribir en los 7 bits restantes es .
Ejemplos:
representación decimal |
Representación binaria (8 bits), código: | ||
---|---|---|---|
directo | espalda | adicional | |
127 | 0111 1111 | 0111 1111 | 0111 1111 |
una | 0000 0001 | 0000 0001 | 0000 0001 |
0 | 0000 0000 | 0000 0000 | 0000 0000 |
-0 | 1000 0000 | 1111 1111 | |
-una | 1000 0001 | 1111 1110 | 1111 1111 |
-2 | 1000 0010 | 1111 1101 | 1111 1110 |
-3 | 1000 0011 | 1111 1100 | 1111 1101 |
-cuatro | 1000 0100 | 1111 1011 | 1111 1100 |
-5 | 1000 0101 | 1111 1010 | 1111 1011 |
-6 | 1000 0110 | 1111 1001 | 1111 1010 |
-7 | 1000 0111 | 1111 1000 | 1111 1001 |
-ocho | 1000 1000 | 1111 0111 | 1111 1000 |
-9 | 1000 1001 | 1111 0110 | 1111 0111 |
-diez | 1000 1010 | 1111 0101 | 1111 0110 |
-once | 1000 1011 | 1111 0100 | 1111 0101 |
-127 | 1111 1111 | 1000 0000 | 1000 0001 |
-128 | --- | --- | 1000 0000 |
El mismo principio también se puede utilizar en la representación informática de cualquier sistema numérico , como los números decimales .
El valor de los dígitos actuales del número no se cambia, pero se agrega el dígito más significativo del signo, cuyo valor es 0. Por ejemplo, el número [+12'345] tendrá la siguiente representación - [012'345 ]
Número negativoAñadimos un dígito mayor de signo igual al dígito mayor de este sistema numérico , en nuestro caso es 9, y también cambiamos los dígitos restantes de acuerdo con una regla determinada; deje que el valor del dígito de cada dígito esté representado por la variable x , excepto por el signo uno, luego imagine el siguiente algoritmo de acciones:
La idea de representar un número decimal (así como cualquier otro) en código complemento a dos es idéntica a las reglas del sistema numérico binario y se puede utilizar en un procesador hipotético:
Habitual
actuación |
Directo
el código |
Primero
suma |
Segundo
suma |
---|---|---|---|
... | ... | ... | ... |
+13 | 0'0013 | 0'0013 | 0'0013 |
+12 | 0'0012 | 0'0012 | 0'0012 |
+11 | 0'0011 | 0'0011 | 0'0011 |
+10 | 0'0010 | 0'0010 | 0'0010 |
+9 | 0'0009 | 0'0009 | 0'0009 |
+8 | 0'0008 | 0'0008 | 0'0008 |
... | ... | ... | ... |
+2 | 0'0002 | 0'0002 | 0'0002 |
+1 | 0'0001 | 0'0001 | 0'0001 |
+0 | 0'0000 | 0'0000 | 0'0000 |
-0 | 9'0000 | 9'9999 | 0'0000 |
-una | 9'0001 | 9'9998 | 9'9999 |
-2 | 9'0002 | 9'9997 | 9'9998 |
-3 | 9'0003 | 9'9996 | 9'9997 |
-cuatro | 9'0004 | 9'9995 | 9'9996 |
... | ... | ... | ... |
-9 | 9'0009 | 9'9990 | 9'9991 |
-diez | 9'0010 | 9'9989 | 9'9990 |
-once | 9'0011 | 9'9988 | 9'9989 |
-12 | 9'0012 | 9'9987 | 9'9988 |
-13 | 9'0013 | 9'9986 | 9'9987 |
Ambos números se representan en complemento a dos. El código complementario de ambos números tiene el mismo número de dígitos. En esta representación, los números se suman.
Los signos son diferentes: si en el proceso de suma se forma un dígito que va más allá de los números iniciales, entonces se omite. El valor resultante se considera positivo cuando los códigos directo y complemento a dos son idénticos. En caso contrario, negativo en forma de código adicional .
Por ejemplo:
Los signos son los mismos:
Por ejemplo:
La conversión de un número de un código directo a uno adicional se realiza de acuerdo con el siguiente algoritmo.
Ejemplo. Convirtamos el número negativo −5, escrito en el código directo, en un código adicional. Código directo para un número negativo -5:
1000 0101Invertimos todas las cifras del número, excepto el signo, obteniendo así el código inverso (primera suma) de un número negativo -5:
1111 1010Sumemos 1 al resultado, obteniendo así el código adicional (segundo complemento) del número negativo -5:
1111 1011Se usa un algoritmo similar para convertir el número negativo -5 escrito en el código de complemento a dos en el número positivo 5 escrito en el código directo. A saber:
1111 1011Invertimos todos los dígitos del número negativo -5, obteniendo así un número 4 positivo en código directo:
0000 0100Sumando 1 al resultado, obtenemos un número 5 positivo en código directo:
0101Y verifique agregando con código adicional
0000 0101 + 1111 1011 = 0000 0000, se descartan los dígitos quinto y superior.En el sistema de números p -ádicos, el cambio de signo de un número se lleva a cabo convirtiendo el número en su código adicional. Por ejemplo, si el sistema numérico es 5, entonces el opuesto de 0001 5 (1 10 ) es 4444 5 (−1 10 ).
Si está leyendo datos de un archivo o área de memoria donde está almacenado en complemento a dos (por ejemplo, un archivo WAVE), puede ser necesario convertir los bytes. Si los datos se almacenan en 8 bits, los valores 128-255 deben ser negativos.
Extensión de signo (ing. Extensión de signo ): una operación en un número binario que le permite aumentar la cantidad de bits mientras mantiene el signo y el valor. Se realiza sumando dígitos a partir del dígito más significativo. Si el número es positivo (el dígito más significativo es 0), entonces se agregan ceros; si es negativo (el dígito más significativo es 1), se agregan unos.
Número decimal | número binario
(8 dígitos) |
número binario
(16 dígitos) |
---|---|---|
diez | 0000 1010 | 0000 0000 0000 1010 |
−15 | 1111 0001 | 1111 1111 1111 0001 |