Articulo de referencia

Complemento de dos

El complemento a dos es el método más común para representar enteros con signo (positivos, negativos y cero) en computadoras, [ 1 ] y, en general, valores binarios de punto fijo...

El complemento a dos es el método más común para representar enteros con signo (positivos, negativos y cero) en computadoras, [ 1 ] y, en general, valores binarios de punto fijo . Al igual que con los sistemas de complemento a uno y signo-magnitud , el complemento a dos utiliza el bit más significativo como signo para indicar números positivos (0) o negativos (1), y a los números no negativos se les da su representación sin signo (6 es 0110, cero es 0000); sin embargo, en complemento a dos, los números negativos se representan tomando el complemento de bits de su magnitud y luego sumando uno (−6 es 1010). El número de bits en la representación se puede aumentar rellenando todos los bits superiores adicionales de los números negativos o positivos con 1 o 0, respectivamente, o disminuir eliminando 1 o 0 iniciales adicionales.

A diferencia del esquema de complemento a uno , el esquema de complemento a dos solo tiene una representación para el cero, con espacio para un número negativo adicional (el rango de un número de 4 bits es de -8 a +7). Además, las mismas implementaciones aritméticas se pueden usar tanto en enteros con signo como sin signo [ 2 ] y difieren solo en las situaciones de desbordamiento de enteros , ya que la suma de las representaciones de un número positivo y su negativo es 0 (con el bit de acarreo activado).

Procedimiento

A continuación se describe el procedimiento para obtener la representación en complemento a dos de un número negativo dado en dígitos binarios:

  • Paso 1: comenzando con la representación binaria absoluta del número, siendo el bit principal un bit de signo; [ 3 ]
  • Paso 2: invertir (o voltear) todos los bits, cambiando cada 0 a 1 y cada 1 a 0;
  • Paso 3: sumar 1 al número invertido completo, ignorando cualquier desbordamiento . Si se tiene en cuenta el desbordamiento, el resultado será incorrecto.

Por ejemplo, para calcular el número decimal −6 en binario a partir del número 6 :

  • Paso 1: +6 en decimal es 0110 en binario; el bit más significativo de la izquierda (el primer 0) es el signo (solo 110 en binario sería −2 en decimal).
  • Paso 2: invierte todos los bits en 0110 , dando como resultado 1001 .
  • Paso 3: suma el valor posicional 1 al número invertido 1001 , obteniendo 1010 .

Para verificar que 1010 efectivamente tiene un valor de −6 , sume los valores posicionales, pero reste el valor del signo del cálculo final. Como el valor más significativo es el valor del signo, debe restarse para producir el resultado correcto: 1010 = ( 1 ×2 3 ) + ( 0 ×2 2 ) + ( 1 ×2 1 ) + ( 0 ×2 0 ) = 1 ×−8 + 0 + 1 ×2 + 0 = −6.

Los pasos 2 y 3 juntos constituyen un método válido para calcular el inverso aditivo.norte{\displaystyle -n}de cualquier número entero (positivo o negativo)norte{\displaystyle n}donde tanto la entrada como la salida están en complemento a dos. Una alternativa para calcularnorte{\displaystyle -n}es usar la resta0norte{\displaystyle 0-n}A continuación se muestra la resta de números enteros en complemento a dos.

Teoría

Representación cíclica de los valores sin signo (anillo blanco), en complemento a uno (naranja) y en complemento a dos (verde azulado) de enteros de 4 bits (negro), y el efecto de sumar 4 a un valor arbitrario.

El complemento a dos es un ejemplo de complemento a la base . El "dos" en el nombre se refiere al número 2ⁿ , "dos elevado a la potencia de N", que es el valor con respecto al cual se calcula el complemento en un sistema de N bits (el único caso en el que se produciría exactamente "dos" en este término es N = 1 , es decir, para un sistema de 1 bit, pero estos no tienen capacidad para un signo y un cero simultáneamente ) . Por lo tanto, la definición precisa del complemento a dos de un número de N bits es el complemento de ese número con respecto a 2ⁿ .

La propiedad definitoria de ser un complemento de un número con respecto a 2 N es simplemente que la suma de este número con el original produce 2 N . Por ejemplo, usando binario con números de hasta tres bits (de modo que N = 3 y 2 N = 2 3 = 8 = 1000 2 , donde ' 2 ' indica una representación binaria), un complemento a dos para el número 3 ( 011 2 ) es 5 ( 101 2 ), porque sumado al original da 2 3 = 1000 2 = 011 2 + 101 2 . Cuando esta correspondencia se emplea para representar números negativos, implica, por analogía con los dígitos decimales y un espacio numérico que solo admite ocho números no negativos (del 0 al 7), dividir dicho espacio en dos conjuntos: los cuatro primeros (0, 1, 2, 3) permanecen invariables, mientras que los cuatro restantes codifican números negativos, manteniendo su orden creciente; así, el 4 codifica -4, el 5 codifica -3, el 6 codifica -2 y el 7 codifica -1. Sin embargo, la representación binaria ofrece una utilidad adicional, ya que el bit más significativo también indica el grupo (y el signo): es 0 para el primer grupo de no negativos y 1 para el segundo grupo de negativos. Las tablas de la derecha ilustran esta propiedad.

El cálculo del complemento a dos binario de un número positivo consiste esencialmente en restar el número de 2N . Pero como se puede ver en el ejemplo de tres bits y en el de cuatro bits 10002 ( 23 ) , el número 2N no se puede representar en un sistema limitado a N bits, ya que está justo fuera del espacio de N bits (sin embargo , el número es el punto de referencia del "complemento a dos" en un sistema de N bits). Debido a esto, los sistemas con un máximo de N bits deben dividir la resta en dos operaciones: primero restar del número máximo en el sistema de N bits, es decir, 2N - 1 (este término en binario es en realidad un número simple que consta de 'todos unos', y se puede restar de él simplemente invirtiendo todos los bits del número, también conocido como la operación NOT bit a bit ) y luego sumar uno. Casualmente, ese número intermedio antes de sumarle uno también se utiliza en informática como otro método de representación de números con signo y se denomina complemento a uno (llamado así porque al sumar dicho número con el original se obtiene un total de unos).

En comparación con otros sistemas para representar números con signo (por ejemplo, el complemento a uno ), el complemento a dos tiene la ventaja de que las operaciones aritméticas fundamentales de suma , resta y multiplicación son idénticas a las de los números binarios sin signo (siempre que las entradas se representen con el mismo número de bits que la salida, y cualquier desbordamiento más allá de esos bits se descarte del resultado). Esta propiedad simplifica la implementación del sistema, especialmente para aritmética de alta precisión. Además, a diferencia de los sistemas de complemento a uno, el complemento a dos no tiene representación para el cero negativo y, por lo tanto, no sufre las dificultades asociadas. Por lo demás, ambos esquemas tienen la propiedad deseada de que el signo de los enteros se puede invertir tomando el complemento de su representación binaria, pero el complemento a dos tiene una excepción: el negativo más pequeño, como se puede ver en las tablas. [ 4 ]

Historia

El método de complementos se había utilizado durante mucho tiempo para realizar restas en máquinas sumadoras decimales y calculadoras mecánicas . John von Neumann sugirió el uso de la representación binaria en complemento a dos en su Primer Borrador de un Informe de 1945 sobre la propuesta EDVAC para una computadora digital electrónica de programa almacenado. [ 5 ] La EDSAC de 1949 , que se inspiró en el Primer Borrador , utilizó la representación en complemento a dos de enteros binarios negativos.

Muchos de los primeros ordenadores, incluidos el CDC 6600 , el LINC , el PDP-1 y el UNIVAC 1107, utilizan la notación de complemento a uno ; los descendientes del UNIVAC 1107, la serie UNIVAC 1100/2200 , continuaron haciéndolo. (Posteriormente, las máquinas DEC de 18 bits admitían tanto la suma en complemento a uno con la instrucción ADD como la aritmética en complemento a dos con la instrucción TAD). Las máquinas científicas de la serie IBM 700/7000 utilizan la notación de signo/magnitud, excepto para los registros de índice que están en complemento a dos. Entre los primeros ordenadores comerciales que almacenaban valores negativos en forma de complemento a dos se incluyen el English Electric DEUCE (1955) y el Digital Equipment Corporation PDP-5 (1963) y PDP-6 (1964). (Las computadoras de la familia PDP-5 y PDP-8 continuaron usando el mnemónico de ensamblador TAD para la suma en complemento a dos, aunque no existía la instrucción ADD en complemento a uno en esas computadoras). El System/360 , presentado en 1964 por IBM , entonces el actor dominante en la industria informática, convirtió el complemento a dos en la representación binaria más utilizada en la industria informática. La primera minicomputadora , la PDP-8 presentada en 1965, utiliza aritmética en complemento a dos, al igual que la Data General Nova de 1969 , la PDP-11 de 1970 y casi todas las minicomputadoras y microcomputadoras posteriores.

Conversión desde la representación en complemento a dos

El sistema numérico de complemento a dos codifica los números positivos y negativos en una representación binaria. El peso de cada bit es una potencia de dos , excepto el bit más significativo , cuyo peso es el negativo de la potencia de dos correspondiente.

El valor w de un entero de N bits anorte1anorte2a0{\displaystyle a_{N-1}a_{N-2}\dots a_{0}}viene dada por la siguiente fórmula:

w=anorte12norte1+i=0norte2ai2i{\displaystyle w=-a_{N-1}2^{N-1}+\sum _{i=0}^{N-2}a_{i}2^{i}}

El bit más significativo determina el signo del número y a veces se le llama bit de signo . A diferencia de la representación de signo y magnitud , el bit de signo también tiene el peso −(2 N − 1 ) que se muestra arriba. Usando N bits, se pueden representar todos los enteros desde −(2 N − 1 ) hasta 2 N − 1 − 1 .

Conversión a la representación en complemento a dos

En la notación de complemento a dos, un número no negativo se representa mediante su representación binaria ordinaria ; en este caso, el bit más significativo es 0. Sin embargo, el rango de números representados no es el mismo que con los números binarios sin signo. Por ejemplo, un número sin signo de 8 bits puede representar los valores de 0 a 255 (11111111). En cambio, un número de 8 bits en complemento a dos solo puede representar enteros no negativos de 0 a 127 (01111111), ya que el resto de las combinaciones de bits con el bit más significativo como '1' representan los enteros negativos de -1 a -128.

La operación de complemento a dos es la operación inversa aditiva , por lo que los números negativos se representan mediante el complemento a dos del valor absoluto .

Del complemento de las unidades

Para obtener el complemento a dos de un número binario negativo, todos los bits se invierten, o "voltean", utilizando la operación NOT a nivel de bits ; luego se suma el valor de 1 al valor resultante, ignorando el desbordamiento que ocurre al tomar el complemento a dos de 0.

Por ejemplo, usando 1 byte (=8 bits), el número decimal 5 se representa mediante

0000 0101 2

El bit más significativo (el bit más a la izquierda en este caso) es 0, por lo que el patrón representa un valor no negativo. Para convertirlo a −5 en notación de complemento a dos, primero se invierten todos los bits, es decir: 0 se convierte en 1 y 1 se convierte en 0:

1111 1010 2

En este punto, la representación es el complemento a uno del valor decimal −5. Para obtener el complemento a dos, se suma 1 al resultado, obteniendo:

1111 1011 2

El resultado es un número binario con signo que representa el valor decimal −5 en complemento a dos. El bit más significativo es 1, lo que indica que el valor representado es negativo.

Alternativamente, en lugar de sumar 1 después de invertir un número binario positivo, se puede restar 1 al número antes de invertirlo. Se puede demostrar fácilmente que ambos métodos son equivalentes. La inversión (complemento a uno) deincógnita{\displaystyle x}igual(2norte1)incógnita{\displaystyle (2^{N}-1)-x}, por lo tanto, la suma de la inversión y 1 es igual a(2norte1)incógnita+1={\displaystyle (2^{N}-1)-x+1=}2norteincógnita1+1={\displaystyle 2^{N}-x-1+1=}2norteincógnita{\displaystyle 2^{N}-x}, que es igual al complemento de dos deincógnita{\displaystyle x}como se esperaba. La inversión deincógnita1{\displaystyle x-1}igual(2norte1)(incógnita1)={\displaystyle (2^{N}-1)-(x-1)=}(2norte1)incógnita+1={\displaystyle (2^{N}-1)-x+1=}2norteincógnita{\displaystyle 2^{N}-x}, idéntica a la ecuación anterior. Esencialmente, la resta inherente a la operación de inversión cambia el −1 sumado aincógnita{\displaystyle x}antes de la inversión en +1 sumado después de la inversión. Este algoritmo alternativo de resta e inversión para formar un complemento a dos puede ser ventajoso en la programación de computadoras o el diseño de hardware, por ejemplo, cuando la resta de 1 se puede obtener gratuitamente incorporándola en una operación anterior. [ 6 ]

El complemento a dos de un número negativo es el valor positivo correspondiente, excepto en el caso especial del número más negativo . Por ejemplo, al invertir los bits de −5 (arriba) se obtiene:

0000 0100 2

Y al sumarle uno se obtiene el valor final:

0000 0101 2

El complemento a dos del número más negativo representable (por ejemplo, un uno como bit más significativo y todos los demás bits cero) es él mismo. Por lo tanto, existe un número negativo «adicional» para el cual el complemento a dos no da la negación; véase el apartado «  Número más negativo» más adelante.

El caso del número más negativo es uno de los dos únicos casos especiales. El otro caso especial es el del cero, cuyo complemento a dos es cero: invertir da todos unos, y sumar uno cambia los unos de nuevo a ceros (ya que se ignora el desbordamiento). Matemáticamente, en el sistema de complemento a dos de los enteros con signo (que representa el negativo de cada número como su complemento a dos), esto es obviamente correcto: el negativo de 0 es de hecho 0 (0=0{\displaystyle -0=0}). Este caso cero también tiene sentido por la definición de complementos a dos: según esa definición, el complemento a dos de cero sería2norte0=2norte{\displaystyle 2^{N}-0=2^{N}}, pero ennorte{\displaystyle N}bits, todos los valores se toman módulo2norte{\displaystyle 2^{N}}, y2norte{\displaystyle 2^{N}}mod2norte=0{\displaystyle 2^{N}=0}. En otras palabras, el complemento a dos de 0 ennorte{\displaystyle N}bits es (por definición) un único bit 1 seguido denorte{\displaystyle N}ceros, pero el 1 se trunca, dejando 0. [ 7 ]

En resumen, el complemento a dos de cualquier número, ya sea positivo, negativo o cero, se puede calcular de la misma manera. En la representación de enteros con signo en complemento a dos, el complemento a dos de cualquier entero es igual a -1 veces ese entero, excepto para el entero más negativo representable en el número de bits dado.norte{\displaystyle N}, es decir, el número entero2norte1{\displaystyle -2^{N-1}}, cuyo complemento a dos es él mismo (todavía negativo).

Resta de 2 N

La suma de un número y su complemento a uno es una palabra de N bits con todos los bits en 1, que es (leído como un número binario sin signo) 2 N − 1. Luego, al sumar un número a su complemento a dos, los N bits menos significativos se establecen en 0 y el bit de acarreo en 1, donde este último tiene un peso (leído como un número binario sin signo) de 2 N. Por lo tanto, en la aritmética binaria sin signo, el valor del número negativo x * de un número positivo x satisface la igualdad x * = 2 Nx . [ a ]

Por ejemplo, para hallar la representación de cuatro bits de −5 (los subíndices denotan la base de la representación ):

x = 5 10 por lo tanto x = 0101 2

Por lo tanto, con N = 4 :

x * = 2 Nx = 2 4 − 5 10 = 16 10 − 5 10 = 10000 2 − 0101 2 = 1011 2

El cálculo se puede realizar completamente en base 10, convirtiendo a base 2 al final:

x * = 2 Nx = 2 4 − 5 10 = 11 10 = 1011 2

Trabajando desde LSB hacia MSB

Un atajo para convertir manualmente un número binario a su complemento a dos consiste en comenzar por el bit menos significativo (LSB) y copiar todos los ceros, trabajando desde el LSB hacia el bit más significativo (MSB) hasta  llegar al primer 1; luego copiar ese  1 e invertir todos los bits restantes (dejar el MSB como 1 si el número inicial estaba en representación de signo y magnitud). Este atajo permite convertir un número a su complemento a dos sin formar primero su complemento a uno. Por ejemplo: en la representación de complemento a dos, la negación de "0011  1100" es "1100  0 100 ", donde los dígitos subrayados no se modificaron con la operación de copia (mientras que el resto de los dígitos se invirtieron).

En los circuitos informáticos, este método no es más rápido que el de "complementar y sumar uno"; ambos requieren trabajar secuencialmente de derecha a izquierda, propagando los cambios lógicos. El método de complementar y sumar uno se puede acelerar mediante un circuito sumador con anticipación de acarreo estándar ; el método de LSB a MSB se puede acelerar mediante una transformación lógica similar.

Extensión de letrero

Al convertir un número en complemento a dos con una cantidad determinada de bits en uno con más bits (por ejemplo, al copiar de una variable de un byte a una de dos bytes), el bit más significativo debe repetirse en todos los bits adicionales. Algunos procesadores realizan esta operación con una sola instrucción; en otros, se debe usar una condición seguida de código para establecer los bits o bytes correspondientes.

De forma similar, al desplazar un número a la derecha, se debe conservar el bit más significativo, que contiene la información de signo. Sin embargo, al desplazarlo a la izquierda, se elimina un bit. Estas reglas preservan la semántica común de que los desplazamientos a la izquierda multiplican el número por dos y los desplazamientos a la derecha lo dividen por dos. No obstante, si el bit más significativo cambia de 0 a 1 (y viceversa), se produce un desbordamiento si el valor representa un entero con signo.

Tanto el desplazamiento como la duplicación de la precisión son importantes para algunos algoritmos de multiplicación. A diferencia de la suma y la resta, la extensión del ancho y el desplazamiento a la derecha se realizan de forma diferente para números con signo y sin signo.

Número más negativo

Con una sola excepción, partiendo de cualquier número en representación de complemento a dos, si se invierten todos los bits y se suma 1, se obtiene la representación en complemento a dos del negativo de ese número.  El 12 positivo se convierte en el 12 negativo  ,  el 5 positivo en el  5 negativo, el cero en el cero (+ desbordamiento), etc.

Calcular el complemento a dos (negación) del número mínimo del rango no produce el efecto deseado de negarlo. Por ejemplo, el complemento a dos de −128 en un sistema de ocho bits es −128  , como se muestra en la tabla de la derecha . Aunque el resultado esperado al negar −128 es +128  , no existe una representación de +128 en un sistema de complemento a dos de ocho bits, por lo que resulta imposible representar la negación. El hecho de que el complemento a dos sea el mismo número se detecta como una condición de desbordamiento, ya que hubo un acarreo de entrada, pero no de salida, del bit más significativo.

Que un número distinto de cero sea igual a su propia negación se debe a que el cero es su propia negación y a que el número total de números es par. Prueba: existen 2^n − 1 números distintos de cero (un número impar). La negación dividiría los números distintos de cero en conjuntos de tamaño 2, pero esto daría como resultado un conjunto de números distintos de cero con cardinalidad par. Por lo tanto, al menos uno de los conjuntos tiene tamaño 1, es decir, un número distinto de cero es su propia negación.

La presencia del número más negativo puede provocar errores de programación inesperados, como que el resultado tenga un signo inesperado, o que genere una excepción de desbordamiento inesperada, o que provoque comportamientos completamente extraños. Por ejemplo,

  • El operador de negación unaria no puede cambiar el signo de un número distinto de cero. Por ejemplo, −(−128)   −128  (donde " " se lee como "se convierte").
  • una implementación de valor absoluto puede devolver un número negativo; [ 8 ] p. ej.,  abs(−128)   −128  .
  • Del mismo modo, la multiplicación por −1 puede no funcionar como se espera; por ejemplo, (−128) × (−1) −128 .    
  • La división por −1 puede provocar una excepción (como la que se produce al dividir por 0 ); [ 9 ] incluso calcular el resto (o módulo ) por −1 puede desencadenar esta excepción; [ 10 ] p. ej., (−128) ÷ (−1)  [ crash ] ,   (−128) % (−1) [ crash ] .     

En los lenguajes de programación C y C++ , los comportamientos mencionados anteriormente no están definidos y no solo pueden generar resultados extraños, sino que el compilador puede asumir que el programador se ha asegurado de que nunca se produzcan operaciones numéricas no definidas, y realizar inferencias a partir de esa suposición. [ 10 ] Esto permite varias optimizaciones, pero también da lugar a varios errores extraños en los programas que utilizan estos cálculos no definidos.

Este número más negativo en complemento a dos  a veces se denomina "el número extraño", porque es la única excepción. [ 11 ] [ 12 ] Aunque el número es una excepción, es un número válido en  los sistemas de complemento a dos regulares. Todas las operaciones aritméticas funcionan con él tanto como operando como (a menos que haya un desbordamiento) como resultado.

Por qué funciona

Dado un conjunto de todos los posibles valores de N bits, podemos asignar a la mitad inferior (por su valor binario) los enteros desde 0 hasta ( 2N − 1 − 1) inclusive , y a la mitad superior desde −2N − 1 hasta −1 inclusive. La mitad superior (de nuevo, por su valor binario) puede usarse para representar enteros negativos desde −2N − 1 hasta −1 porque, bajo la suma módulo 2N , se comportan de la misma manera que esos enteros negativos. Es decir, como i + j mod 2N = i + ( j + 2N ) mod 2N , cualquier valor del conjunto { j + k 2N | k es un entero} puede usarse en lugar de j . [ 13 ] 

Por ejemplo, con ocho bits, los bytes sin signo son del 0 al 255. Restando 256 de la mitad superior (del 128 al 255) se obtienen los bytes con signo del -128 al -1.

La relación con el complemento a dos se realiza al observar que 256 = 255 + 1 y (255 − x ) es el complemento a uno de x . 

Ejemplo

Por ejemplo, un número de 8  bits solo puede representar cada entero desde −128 hasta 127, ambos inclusive, ya que (2 8 − 1 = 128) . −95 módulo 256 es equivalente a 161, ya que

−95. + 256.
= −95. + 255. + 1
= 255. − 95. + 1
= 160. + 1.
= 161.
 1111 1111 255. − 0101 1111 − 95. =========== ===== 1010 0000 (complemento a uno) 160. + 1 + 1 =========== ===== 1010 0001 (complemento a dos) 161. 

Fundamentalmente, el sistema representa los enteros negativos contando hacia atrás y volviendo al principio . El límite entre números positivos y negativos es arbitrario, pero por convención , todos los números negativos tienen un bit más a la izquierda ( el bit más significativo ) de uno. Por lo tanto, el número de cuatro bits más positivo es 0111  (7.) y el más negativo es 1000 (−8.). Debido al uso del bit más a la izquierda como bit de signo, el valor absoluto del número más negativo (|−8.| = 8.) es demasiado grande para representarlo. Negar un número en complemento a dos es simple: se invierten todos los bits y se suma uno al resultado. Por ejemplo, al negar 1111, obtenemos 0000 + 1 = 1. Por lo tanto, 1111 en binario debe representar −1 en decimal. [ 14 ]

El sistema resulta útil para simplificar la implementación de operaciones aritméticas en hardware informático. Sumar 0011  (3.) a 1111  (−1.) parece, en principio, dar como resultado incorrecto 10010. Sin embargo, el hardware puede simplemente ignorar el bit más a la izquierda para dar el resultado correcto 0010  (2.). Aún deben existir comprobaciones de desbordamiento para detectar operaciones como la suma de 0100 y 0100.

Por lo tanto, el sistema permite sumar operandos negativos sin un circuito de resta ni un circuito que detecte el signo del número. Además, dicho circuito de suma también puede realizar restas calculando el complemento a dos (véase más abajo), lo que solo requiere un ciclo adicional o su propio circuito sumador. Para ello, el circuito simplemente opera como si hubiera un bit adicional de 1 en el extremo izquierdo.

Operaciones aritméticas

Suma

La suma de números en complemento a dos no requiere ningún procesamiento especial, incluso si los operandos tienen signos opuestos; el signo del resultado se determina automáticamente. Por ejemplo, al sumar 15 y −5:

 0000 1111 (15) + 1111 1011 (−5) =========== 0000 1010 (10) 

O el cálculo de 5 − 15 = 5 + (−15):

 0000 0101 ( 5) + 1111 0001 (−15) =========== 1111 0110 (−10) 

Este proceso depende de restringirse a 8 bits de precisión; se ignora un acarreo al noveno bit más significativo (inexistente), lo que da como resultado el resultado aritméticamente correcto de 10 10 .

Los dos últimos bits de la fila de acarreo (leyendo de derecha a izquierda) contienen información vital: si el cálculo resultó en un desbordamiento aritmético , es decir, un número demasiado grande para que el sistema binario lo represente (en este caso, mayor de 8 bits). Existe una condición de desbordamiento cuando estos dos últimos bits son diferentes. Como se mencionó anteriormente, el signo del número está codificado en el bit más significativo (MSB) del resultado.

En otras palabras, si los dos bits de acarreo de la izquierda (los que se encuentran en el extremo izquierdo de la fila superior en estos ejemplos) son ambos 1 o ambos 0, el resultado es válido; si los dos bits de acarreo de la izquierda son "1 0" o "0 1", se ha producido un desbordamiento de signo. Convenientemente, una operación XOR sobre estos dos bits puede determinar rápidamente si existe una condición de desbordamiento. Como ejemplo, consideremos la suma de 4 bits con signo de 7 y 3:

 0111 (llevar) 0111 (7) + 0011 (3) ====== 1010 (−6) ¡inválido! 

En este caso, los dos bits más significativos (MSB) del extremo izquierdo son "01", lo que significa que hubo un desbordamiento en la suma de complemento a dos. Es decir, 1010 2 = 10 10 está fuera del rango permitido de -8 a 7. El resultado sería correcto si se tratara como un entero sin signo.

En general, dos números de N bits pueden sumarse sin desbordamiento, extendiendo primero el signo de ambos a N + 1 bits y sumándolos como se indicó anteriormente. El resultado de N + 1 bits es lo suficientemente grande como para representar cualquier suma posible ( el complemento a dos de N = 5 puede representar valores en el rango de -16 a 15), por lo que nunca se producirá un desbordamiento. Si se desea, es posible truncar el resultado a N bits conservando el valor si, y solo si, el bit descartado es una extensión de signo adecuada de los bits del resultado retenido. Esto proporciona otro método para detectar el desbordamiento, equivalente al método de comparación de los bits de acarreo, pero que puede ser más fácil de implementar en algunas situaciones, ya que no requiere acceso a los detalles internos de la suma.

Sustracción

Las computadoras suelen usar el método de complementos para realizar la resta. El uso de complementos para la resta está estrechamente relacionado con su uso para representar números negativos, ya que la combinación permite todos los signos de los operandos y los resultados; la resta directa también funciona con números en complemento a dos. Al igual que en la suma, la ventaja de usar el complemento a dos es que elimina la necesidad de examinar los signos de los operandos para determinar si se necesita una suma o una resta. Por ejemplo, restar -5 de 15 es en realidad sumar 5 a 15, pero esto queda oculto por la representación en complemento a dos.

 11110 000 (préstamo) 0000 1111 (15) − 1111 1011 (−5) =========== 0001 0100 (20) 

El desbordamiento se detecta de la misma manera que en la suma, examinando los dos bits más a la izquierda (más significativos) de los préstamos; se ha producido un desbordamiento si son diferentes.

Otro ejemplo es una operación de resta cuyo resultado es negativo: 15   35 = −20:

 11100 000 (préstamo) 0000 1111 (15) − 0010 0011 (35) =========== 1110 1100 (−20) 

En cuanto a la suma, el desbordamiento en la resta se puede evitar (o detectar después de la operación) extendiendo primero el signo de ambas entradas con un bit adicional.

Multiplicación

El producto de dos números de N bits requiere 2N bits para contener todos los valores posibles. [ 15 ]

Si se duplica la precisión de los dos operandos utilizando el complemento a dos antes de la multiplicación, la multiplicación directa (descartando cualquier bit sobrante más allá de esa precisión) proporcionará el resultado correcto. [ 16 ] Por ejemplo, tomemos 6 × (−5) = −30 . Primero, la precisión se extiende de cuatro bits a ocho. Luego, los números se multiplican, descartando los bits más allá del octavo bit (como se muestra con " x "):

 00000110 (6) * 11111011 (−5) ============ 110 1100 00000 110000 1.100.000 11000000 x10000000 + xx00000000 ============ xx11100010 

Esto es muy ineficiente; al duplicar la precisión de antemano, todas las sumas deben ser de doble precisión y se necesitan al menos el doble de productos parciales que para los algoritmos más eficientes implementados en las computadoras. Algunos algoritmos de multiplicación están diseñados para el complemento a dos, en particular el algoritmo de multiplicación de Booth . Los métodos para multiplicar números de magnitud con signo no funcionan con números en complemento a dos sin adaptación. Por lo general, no hay problema cuando el multiplicando (el que se suma repetidamente para formar el producto) es negativo; el problema radica en establecer correctamente los bits iniciales del producto cuando el multiplicador es negativo. Dos métodos para adaptar los algoritmos para manejar números en complemento a dos son comunes:

  • Primero, comprueba si el multiplicador es negativo. Si lo es, niega (es decir, calcula el complemento a dos) de ambos operandos antes de multiplicar. El multiplicador será positivo, por lo que el algoritmo funcionará. Como ambos operandos están negados, el resultado conservará el signo correcto.
  • Resta el producto parcial resultante del bit más significativo (bit de pseudo signo) en lugar de sumarlo como en los demás productos parciales. Este método requiere que el bit de signo del multiplicando se extienda una posición, conservándose durante las operaciones de desplazamiento a la derecha. [ 17 ]

Como ejemplo del segundo método, consideremos el algoritmo común de suma y desplazamiento para la multiplicación. En lugar de desplazar los productos parciales hacia la izquierda, como se hace con lápiz y papel, el producto acumulado se desplaza hacia la derecha, a un segundo registro que eventualmente contendrá la mitad menos significativa del producto. Dado que los bits menos significativos no se modifican una vez calculados, las sumas pueden ser de precisión simple, acumulándose en el registro que eventualmente contendrá la mitad más significativa del producto. En el siguiente ejemplo, multiplicando nuevamente 6 por −5, los dos registros y el bit de signo extendido están separados por "|":

 0 0110 (6) (multiplicando con bit de signo extendido) × 1011 (−5) (multiplicador) =|====|==== 0|0110|0000 (primer producto parcial (el bit más a la derecha es 1)) 0|0011|0000 (desplazamiento a la derecha, conservando el bit de signo extendido) 0|1001|0000 (sumar segundo producto parcial (el siguiente bit es 1)) 0|0100|1000 (desplazamiento a la derecha, conservando el bit de signo extendido) 0|0100|1000 (sumar tercer producto parcial: 0, por lo que no hay cambios) 0|0010|0100 (desplazamiento a la derecha, conservando el bit de signo extendido) 1|1100|0100 (restar el último producto parcial ya que proviene del bit de signo) 1|1110|0010 (desplazamiento a la derecha, conservando el bit de signo extendido) |1110|0010 (se descarta el bit de signo extendido, lo que da como resultado final −30) 

Comparación (ordenación)

La comparación se suele realizar mediante una resta ficticia, donde se comprueban los indicadores del registro de estado del ordenador , pero se ignora el resultado principal. El indicador cero indica si dos valores comparados son iguales. Si la operación OR exclusiva de los indicadores de signo y desbordamiento es 1, el resultado de la resta fue menor que cero; de lo contrario, el resultado fue cero o mayor. Estas comprobaciones se suelen implementar en los ordenadores mediante instrucciones de salto condicional .

Los números binarios sin signo se pueden ordenar mediante un orden lexicográfico simple , donde el valor del bit 0 se define como menor que el valor del bit 1. Para los valores en complemento a dos, el significado del bit más significativo se invierte (es decir, 1 es menor que 0).

El siguiente algoritmo (para una arquitectura de complemento a dos de n bits) establece el registro de resultado R en −1 si A < B, en +1 si A > B y en 0 si A y B son iguales:

// comparación inversa del bit de signoSi A ( n - 1 ) = 0 y B ( n - 1 ) = 1 , entonces devuelve +1 ; de lo contrario, si A ( n - 1 ) = 1 y B ( n - 1 ) = 0 , entonces devuelve -1 . Fin ; // comparación de los bits restantes.para i := n - 2 hasta 0 hacer begin si A ( i ) = 0 y B ( i ) = 1 entonces devolver - 1 sino si A ( i ) = 1 y B ( i ) = 0 entonces devolver + 1 fin fin devolver 0

Complemento a dos y números 2-ádicos

En un artículo clásico de HAKMEM publicado por el Laboratorio de IA del MIT en 1972, Bill Gosper señaló que la representación interna de una máquina, ya sea en complemento a dos o no, podía determinarse sumando las potencias sucesivas de dos. En un arrebato de imaginación, señaló que el resultado de realizar esto algebraicamente indicaba que "el álgebra se ejecuta en una máquina (el universo) que está en complemento a dos". [ 18 ]

La conclusión final de Gosper no necesariamente debe tomarse en serio, y es similar a una broma matemática . El paso crítico es "...110 = ...111   1", es decir, "2 X = X  1", y por lo tanto X  =  ...111  =  −1. Esto presupone un método por el cual una cadena infinita de 1s se considera un número, lo que requiere una extensión de los conceptos finitos de valor posicional en aritmética elemental . Es significativo ya sea como parte de una notación de complemento a dos para todos los enteros, como un número 2-ádico típico , o incluso como una de las sumas generalizadas definidas para la serie divergente de números reales 1 + 2 + 4 + 8 + ⋯ . [ 19 ] Los circuitos aritméticos digitales, idealizados para operar con cadenas de bits infinitas (que se extienden a potencias positivas de 2), producen suma y multiplicación 2-ádicas compatibles con la representación de complemento a dos. [ 20 ] La continuidad de las operaciones aritméticas binarias y bit a bit en la métrica 2-ádica también tiene cierta utilidad en criptografía. [ 21 ]

Conversión de fracciones

Para convertir un número con parte fraccionaria , como 0.0101, se deben convertir las unidades a decimal, comenzando de derecha a izquierda, como en una conversión normal. En este ejemplo, 0.0101 equivale a 5 en decimal. Cada dígito después de la coma decimal representa una fracción cuyo denominador es un múltiplo de 2. Así, el primero es 1/2, el segundo 1/4, y así sucesivamente. Habiendo calculado ya el valor decimal como se mencionó anteriormente, solo se utiliza el denominador del LSB (LSB = comenzando de derecha a izquierda). El resultado final de esta conversión es 5/16.

Por ejemplo, para que este método funcione, con el valor decimal 0.0110, no se debe considerar el último 0 desde la derecha. Por lo tanto, en lugar de calcular el valor decimal de 0110, calculamos el valor 011, que es 3 en decimal (si dejamos el 0 al final, el resultado habría sido 6, junto con el denominador 2 4  =  16, que se reduce a 3/8). El denominador es 8, lo que da un resultado final de 3/8.

Véase también

Notas

  1. Para x = 0 tenemos 2 N − 0 = 2 N , lo cual es equivalente a 0* = 0 módulo 2 N (es decir, después de restringir a los N bits menos significativos).

Referencias

  1. Por ejemplo: "Los enteros con signo son valores binarios en complemento a dos que pueden usarse para representar tanto valores enteros positivos como negativos", Sección 4.2.1 en el Manual del desarrollador de software de las arquitecturas Intel 64 e IA-32 , Volumen 1: Arquitectura básica, noviembre de 2006.
  2. ^ Bergel, Alejandro; Cassou, Damián; Ducasse, Stéphane; Laval, Jannik (2013). En lo profundo de Pharo (PDF) . pag. 337. 
  3. "Complemento a dos" (PDF) . Centro de Éxito Académico de la Universidad de Rochester .
  4. Lilja, David J.; Sapatnekar, Sachin S. (2005). Diseño de sistemas informáticos digitales con Verilog . Cambridge University Press. ISBN 9780521828666.
  5. von Neumann, John (1945), Primer borrador de un informe sobre el EDVAC (PDF) , consultado el 20 de febrero de 2021
  6. ... por ejemplo, reduciendo una constante sumada en 1, aumentando una constante restada en 1 o estableciendo el indicador de acarreo/préstamo antes de una operación de resta con préstamo. Por ejemplo, para calcular(metro+4){\displaystyle -(m+4)}, en lugar de agregar 4 ametro{\displaystyle m}, invirtiendo el resultado y luego sumando 1, uno puede simplemente sumar 3 (= 4 − 1) ametro{\displaystyle m}y luego invertir el resultado. (Por supuesto, también es una opción, utilizando el esquema de inversión y suma, invertirmetro{\displaystyle m}primero y luego restar 3 [equivalente a sumar −3 = −4 + ​​1].)
  7. Cero es el único valor que, al sumarse a su complemento a dos, utilizando aritmética binaria (modular) de máquina, no da como resultado cero.2norte{\displaystyle 2^{N}}, pero observe que en aritmética módulo2norte{\displaystyle 2^{N}},0{\displaystyle 0}es congruente con2norte{\displaystyle 2^{N}}.
  8. "Matemáticas" . Especificación de la API. Plataforma Java SE 7. 
  9. Regehr, John (2013). "Nadie espera que la Inquisición española, o INT_MIN, se divida por −1" . Regehr.org (blog).
  10. 1 2 Seacord, Robert C. (2020). "Asegurar que las operaciones con enteros con signo no produzcan desbordamiento" . Regla INT32-C. wiki.sei.cmu.edu . Estándar de codificación C de SEI CERT . 
  11. Affeldt, Reynald y Marti, Nicolas (2006). Verificación formal de funciones aritméticas en lenguaje ensamblador SmartMIPS (PDF) (Informe). Archivado del original (PDF) el 22 de julio de 2011.
  12. Harris, David Money; Harris, Sarah L. (2007). Diseño digital y arquitectura informática . Morgan Kaufmann. pág. 18. ISBN  978-0-08-054706-0 vía Google Libros.
  13. "3.9. Complemento a dos" . Capítulo 3. Representación de datos . cs.uwm.edu. 3 de diciembre de 2012. Archivado del original el 31 de octubre de 2013. Consultado el 22 de junio de 2014 .
  14. Finley, Thomas (abril de 2000). "Complemento a dos" . Ciencias de la Computación. Apuntes de clase para CS 104. Ithaca, Nueva York: Universidad de Cornell . Recuperado el 22 de junio de 2014 . 
  15. Bruno Paillard. Introducción a los procesadores de señales digitales , sec. 6.4.2. Informe Génie électrique et informatique, Universidad de Sherbrooke, abril de 2004.
  16. Karen Miller (24 de agosto de 2007). "Multiplicación en complemento a dos" . cs.wisc.edu . Archivado del original el 13 de febrero de 2015. Consultado el 13 de abril de 2015 .
  17. Wakerly, John F. (2000). Principios y prácticas del diseño digital (3.ª ed.). Prentice Hall. pág. 47. ISBN   0-13-769191-2.
  18. "Trucos de programación" . HAKMEM . ELEMENTO 154 (Gosper). Archivado del original el 24/02/2024.
  19. Para la suma de 1 + 2 + 4 + 8 + ⋯ sin recurrir a la métrica 2-ádica, véase Hardy, GH (1949). Divergent Series . Clarendon Press. pp. 7– ​​10. LCC QA295 .H29 1967 .    
  20. Vuillemin, Jean (1993). "Capítulo 7". Sobre circuitos y números (PDF) . París: Digital Equipment Corporation . pág. 19. Consultado el 29 de marzo de 2023 . Véase especialmente el capítulo 7.3 para la multiplicación.
  21. Anashin, Vladimir; Bogdanov, Andrey; Kizhvatov, Ilya (2007). "Cifrado de flujo ABC" . Universidad Estatal Rusa de Humanidades . Recuperado el 24 de enero de 2012 .

Lecturas adicionales

  • Explicación del complemento a dos (Thomas Finley, 2000)
  • Koren, Israel (2002). Algoritmos aritméticos informáticos . AK Peters. ISBN 1-56881-160-8.
  • Flores, Ivan (1963). La lógica de la aritmética computacional . Prentice-Hall.
  • Simulador JavaScript para multiplicador de matrices en complemento a dos
Obtenido de " https://en.wikipedia.org/w/index.php?title=Two%27s_complement&oldid=1361580636 "