Código adicional

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 31 de enero de 2021; las comprobaciones requieren 22 ediciones .

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).

Representación en complemento a dos de un número negativo

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       

Código adicional en un sistema numérico diferente

El mismo principio también se puede utilizar en la representación informática de cualquier sistema numérico , como los números decimales .

Transformaciones sobre el ejemplo del sistema numérico decimal [1]

Número positivo

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 negativo

Añ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:

  1. Asigne a la variable x un nuevo valor igual a la expresión 9 - x (el proceso de obtener el código inverso) - por ejemplo, un número negativo [ -12345 ] en el código directo del dígito más significativo al menos significativo se verá así [9' 12345 ], donde 9 es un dígito de signo, y en la representación inversa del código se verá así: [9'87654].
  2. Agregamos 1 al número resultante, por lo que el número [9'87654] (primera adición) se verá como [987'655] (código adicional).
  3. Si surgiera una situación de transferencia de bits, como resultado de la cual se formó un nuevo bit, entonces lo omitimos (el bit más alto) y consideramos que el número resultante es positivo. El número positivo resultante se representará por igual, tanto en código directo como en complemento a dos. Por ejemplo, teniendo la capacidad de representar cero negativo y positivo de esta forma, analicemos su traducción a un código adicional (1 signo y 4 dígitos adicionales):
    • [+0] en código directo [0'0000]. Los complementos primero y segundo son [0'0000].
    • [-0] en código directo [9'0000]. La primera adición es [9'9999]. Al recibir el segundo complemento, se omite el bit alto del número [(1)0'0000] y se obtiene el valor resultante [0'0000], como en el número [+0].

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

Aritmética en complemento a dos

Suma y resta

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:

  • [1234] + [-78] → [0'1234] + [9'9922] = [(1)0'1156] = [1156].
  • [-1234] + [78] → [9'8766] + [0'0078] = [9'8844] = [-1156].

Los signos son los mismos:

  • numeros positivos La descarga no cae, el resultado es positivo.
  • Números negativos. Se omite el dígito, el resultado es negativo en el código de complemento a dos.

Por ejemplo:

  • [1234] + [78] → [0'1234] + [0'0078] = [0'1312] = [1312].
  • [-1234] + [-78] → [9'8766] + [9'9922] = [(1)9'8688] → (primer complemento) [0'1311] → (segundo complemento o representación regular) [0 '1312]. Cuando se traduce del complemento a dos a la representación normal, el valor resultante es absoluto.

Convirtiendo a complemento de dos

La conversión de un número de un código directo a uno adicional se realiza de acuerdo con el siguiente algoritmo.

  1. Si el bit más significativo (signo) del número escrito en el código directo es 0, entonces el número es positivo y no se realizan transformaciones;
  2. Si el dígito más significativo (signo) del número escrito en el código directo es 1, entonces el número es negativo, todos los dígitos del número, excepto el signo, se invierten y se suma 1 al resultado.

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 0101

Invertimos todas las cifras del número, excepto el signo, obteniendo así el código inverso (primera suma) de un número negativo -5:

1111 1010

Sumemos 1 al resultado, obteniendo así el código adicional (segundo complemento) del número negativo -5:

1111 1011

Se 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 1011

Invertimos todos los dígitos del número negativo -5, obteniendo así un número 4 positivo en código directo:

0000 0100

Sumando 1 al resultado, obtenemos un número 5 positivo en código directo:

0101

Y verifique agregando con código adicional

0000 0101 + 1111 1011 = 0000 0000, se descartan los dígitos quinto y superior.

Números p-ádicos

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 ).

Implementación del algoritmo de conversión de complemento a dos (para números de 8 bits)

Pascual

si ( a < 0 ) entonces a := (( no a ) o 128 ) + 1 ;

C/C++

conversión int ( int a ) { si ( un < 0 ) a = ~ ( - a ) + 1 ; devolver un ; }

Ventajas y desventajas

Beneficios

  • Instrucciones generales (procesador) para suma, resta y desplazamiento a la izquierda para números con y sin signo (diferencias solo en indicadores aritméticos que deben verificarse para controlar el desbordamiento en el resultado).
  • La ausencia del número " menos cero ".

Desventajas

  • La representación de un número negativo no se lee visualmente de acuerdo con las reglas habituales; su percepción requiere una habilidad especial o cálculos adicionales para llevarlo a una forma normal.
  • En algunas representaciones (como BCD ) o sus componentes (como la mantisa de un número de punto flotante ), la codificación adicional es un inconveniente.
  • El módulo del número más grande no es igual al módulo del número más pequeño. Por ejemplo, para un entero de ocho bits con signo, el número máximo es 127 10 = 01111111 2 , el número mínimo es -128 10 = 10000000 2 . En consecuencia, no para cualquier número hay un opuesto. La operación de cambio de señal puede requerir una verificación adicional.

Ejemplo de conversión programática

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.

Estilo C# .NET / C

byte b1 = 254 ; //11111110 (binario) byte b2 = 121 ; //01111001 (binario) byte c = 1 <<( sizeof ( byte )* 8 - 1 ); //2 se eleva a la potencia de 7. Resultado: 10000000 (binario) byte b1Conversion =( c ^ b1 ) - c ; //Resultado: -2. Y de hecho, un código binario en complemento a dos. byte b2Conversion =( c ^ b2 ) - c ; //El resultado sigue siendo 121 porque el bit de signo es cero.

Extensión de signo

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.

Ejemplo

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

Véase también

Literatura

  • Behrooz Parhami. 2.3. Complemento Representación, 2.4. Números en complemento a dos y a uno // Aritmética informática: algoritmos y diseños de hardware . - Nueva York: Oxford University Press, 2000. - P. 22-27. — 510p. — ISBN 0-19-512583-5 .
  • Samofalov K.G., Romankevich A.M., Valuysky V.N., Kanevsky Yu.S., Pinevich M.M. Teoría aplicada de los autómatas digitales. - K. : escuela Vishcha, 1987. - 375 p.

Enlaces

  1. Tecnología de Florida . Consultado el 28 de noviembre de 2020. Archivado desde el original el 8 de octubre de 2016.