Articulo de referencia

Representaciones de números con signo

En informática , se requieren representaciones numéricas con signo para codificar números negativos en sistemas numéricos binarios. En matemáticas , los números negativos en cua...

En informática , se requieren representaciones numéricas con signo para codificar números negativos en sistemas numéricos binarios.

En matemáticas , los números negativos en cualquier base se representan anteponiendo un signo menos ("−"). Sin embargo, en la RAM o los registros de la CPU , los números se representan únicamente como secuencias de bits , sin símbolos adicionales. Los cuatro métodos más conocidos para extender el sistema numérico binario a la representación de números con signo son: signo-magnitud , complemento a uno , complemento a dos y binario con desplazamiento . Algunos métodos alternativos utilizan signos implícitos en lugar de explícitos, como el binario negativo, que utiliza la base −2 . Se pueden diseñar métodos similares para otras bases , ya sean positivas, negativas, fraccionarias u otras variaciones de estos conceptos.

No existe un criterio definitivo que determine si alguna de las representaciones es universalmente superior. Para los números enteros , la representación utilizada en la mayoría de los dispositivos informáticos actuales es el complemento a dos, aunque los ordenadores centrales de la serie Unisys ClearPath Dorado utilizan el complemento a uno.

Historia

Los inicios de la informática digital estuvieron marcados por ideas contrapuestas sobre la tecnología del hardware y la tecnología matemática (sistemas de numeración). Uno de los grandes debates giró en torno al formato de los números negativos, con algunos de los principales expertos de la época expresando opiniones muy firmes y divergentes. Un grupo defendía el complemento a dos , el sistema dominante en la actualidad. Otro grupo defendía el complemento a uno, donde un valor negativo se forma invirtiendo todos los bits de su equivalente positivo. Un tercer grupo defendía el sistema signo-magnitud, donde un valor cambia de positivo a negativo simplemente invirtiendo el bit de orden superior de la palabra.

Existían argumentos a favor y en contra de cada uno de los sistemas. El sistema signo-magnitud permitía un seguimiento más sencillo de los volcados de memoria (un proceso común en la década de 1960), ya que los valores numéricos pequeños utilizaban menos bits 1. Estos sistemas realizaban internamente operaciones matemáticas en complemento a uno, por lo que los números debían convertirse a valores en complemento a uno al transmitirse desde un registro a la unidad matemática y luego volver a convertirse a signo-magnitud al transmitir el resultado de vuelta al registro . La electrónica requería más puertas lógicas que los otros sistemas , una preocupación clave cuando el coste y el encapsulado de los transistores discretos eran críticos. IBM fue uno de los primeros defensores del sistema signo-magnitud, siendo sus ordenadores de las series 704 , 709 y 709x quizás los sistemas más conocidos que lo utilizaron. 

El complemento a uno permitió diseños de hardware algo más sencillos, ya que no era necesario convertir valores al pasarlos a la unidad matemática y viceversa. Sin embargo, también compartía una característica indeseable con el signo-magnitud: la capacidad de representar el cero negativo (−0). El cero negativo se comporta exactamente igual que el cero positivo: cuando se usa como operando en cualquier cálculo, el resultado será el mismo, ya sea que el operando sea cero positivo o negativo. La desventaja es que la existencia de dos formas del mismo valor requiere dos comparaciones al comprobar la igualdad con cero. La resta en complemento a uno también puede dar lugar a un préstamo de extremo a extremo (que se describe más adelante). Se puede argumentar que esto complica la lógica de suma y resta o que la simplifica, ya que una resta solo requiere invertir los bits del segundo operando al pasarlo al sumador. Los ordenadores PDP-1 , CDC 160 , CDC 3000 , CDC 6000 , UNIVAC 1100 y LINC utilizan la representación en complemento a uno.

El complemento a dos es el más fácil de implementar en hardware, lo que puede ser la razón principal de su gran popularidad. [ 1 ] Los procesadores de los primeros mainframes a menudo constaban de miles de transistores, por lo que eliminar una cantidad significativa de transistores supuso un ahorro de costes considerable. Mainframes como el IBM System/360 , la serie GE-600 , [ 2 ] y el PDP-6 y PDP-10 utilizan el complemento a dos, al igual que las minicomputadoras como el PDP-5 y PDP-8 y las máquinas PDP-11 y VAX . Los arquitectos de las primeras CPU basadas en circuitos integrados ( Intel 8080 , etc.) también optaron por utilizar matemáticas de complemento a dos. A medida que avanzaba la tecnología de CI, la tecnología de complemento a dos se adoptó en prácticamente todos los procesadores, incluidos x86 , [ 3 ] m68k , Power ISA , [ 4 ] MIPS , SPARC , ARM , Itanium , PA-RISC y DEC Alpha .

Signo-magnitud

En la representación signo-magnitud , también llamada signo-y-magnitud o magnitud con signo , un número con signo se representa mediante el patrón de bits correspondiente al signo del número para el bit de signo (a menudo el bit más significativo , establecido en 0 para un número positivo y en 1 para un número negativo), y la magnitud del número (o valor absoluto ) para los bits restantes. Por ejemplo, en un byte de ocho bits , solo siete bits representan la magnitud, que puede variar de 0000000 (0) a 1111111 (127). Por lo tanto, los números que van desde −127 10 hasta +127 10 pueden representarse una vez que se agrega el bit de signo (el octavo bit). Por ejemplo, −43 10 codificado en un byte de ocho bits es 1 0101011 mientras que 43 10 es 0 0101011. El uso de la representación signo-magnitud tiene múltiples consecuencias que hacen que su implementación sea más compleja: [ 5 ]

  1. Hay dos formas de representar el cero: 00000000 (0) y 10000000 ( −0 ).
  2. La suma y la resta requieren un comportamiento diferente según el bit de signo, mientras que el complemento a uno puede ignorar el bit de signo y simplemente realizar un acarreo de extremo a extremo, y el complemento a dos puede ignorar el bit de signo y depender del comportamiento de desbordamiento.
  3. La comparación también requiere inspeccionar el bit de signo, mientras que en el complemento a dos, simplemente se pueden restar los dos números y comprobar si el resultado es positivo o negativo.
  4. El número negativo mínimo es −127, en lugar de −128 como en el caso del complemento a dos.

Este método es directamente comparable a la forma habitual de indicar un signo (colocando un "+" o un "−" junto a la magnitud del número). Algunas computadoras binarias antiguas (por ejemplo, la IBM 7090 ) utilizan esta representación, quizás debido a su familiaridad con el uso común. El signo-magnitud es la forma más común de representar la mantisa en valores de coma flotante .

Complemento de uno

En la representación de complemento a uno , [ 6 ] un número negativo se representa mediante el patrón de bits correspondiente a la negación bit a bit (es decir, el "complemento") del número positivo. Al igual que la representación signo-magnitud, el complemento a uno tiene dos representaciones de 0: 00000000 (+0) y 11111111 ( −0 ). [ 7 ]

Como ejemplo, la forma en complemento a uno de 00101011 (43 10 ) se convierte en 11010100 (−43 10 ). El rango de números con signo que utilizan el complemento a uno está representado por −(2 N −1 − 1) a (2 N −1 − 1) y ±0. Un byte convencional de ocho bits es de −127 10 a +127 10 donde cero es 00000000 (+0) o 11111111 (−0).

Para sumar dos números representados en este sistema, se realiza una suma binaria convencional, pero luego es necesario realizar un acarreo de extremo a extremo : es decir, sumar cualquier acarreo resultante de vuelta a la suma resultante. [ 8 ] Para ver por qué esto es necesario, considere el siguiente ejemplo que muestra el caso de la suma de −1 ( 11111110 ) a +2 ( 00000010 ):

 binario decimal 11111110 −1 + 00000010 +2 ─────────── ── 1 00000000 0 ← Respuesta incorrecta 1 +1 ← Sumar acarreo ─────────── ── 00000001 1 ← Respuesta correcta 

En el ejemplo anterior, la primera suma binaria da 00000000 , lo cual es incorrecto. El resultado correcto ( 00000001 ) solo aparece cuando se vuelve a sumar el acarreo.

Una aclaración sobre la terminología: El sistema se denomina "complemento a uno" porque la negación de un valor positivo x (representado como la negación bit a bit de x ) también se puede formar restando x de la representación en complemento a uno de cero, que es una larga secuencia de unos (−0). Por otro lado, la aritmética en complemento a dos forma la negación de x restando x de una única potencia grande de dos que es congruente con +0. [ 9 ] Por lo tanto, las representaciones en complemento a uno y en complemento a dos del mismo valor negativo diferirán en uno.

Nótese que la representación en complemento a uno de un número negativo se puede obtener a partir de la representación signo-magnitud simplemente complementando bit a bit la magnitud (invirtiendo todos los bits después del primero). Por ejemplo, el número decimal −125 con su representación signo-magnitud 11111101 se puede representar en forma de complemento a uno como 10000010 .

Complemento de dos

En la representación en complemento a dos , un número negativo se representa mediante el patrón de bits correspondiente a la negación bit a bit (es decir, el "complemento") del número positivo más uno, o sea, el complemento a uno más uno. Esto evita los problemas de las múltiples representaciones de 0 y la necesidad del acarreo de extremo a extremo de la representación en complemento a uno. También puede entenderse como el bit más significativo que representa el inverso de su valor en un entero sin signo; en un byte sin signo de 8 bits, el bit más significativo representa la posición 128, mientras que en complemento a dos ese bit representaría -128.

En complemento a dos, solo hay un cero, representado como 00000000. Negar un número (ya sea negativo o positivo) se hace invirtiendo todos los bits y luego sumando uno al resultado. [ 10 ] Esto refleja la estructura de anillo en todos los enteros módulo 2 N :Z/2norteZ{\displaystyle \mathbb {Z} /2^{N}\mathbb {Z} }La suma de un par de enteros en complemento a dos es igual que la suma de un par de números sin signo (excepto por la detección de desbordamiento , si se realiza); lo mismo ocurre con la resta e incluso con los N bits menos significativos de un producto (valor de la multiplicación). Por ejemplo, la suma en complemento a dos de 127 y -128 produce el mismo patrón de bits binarios que la suma sin signo de 127 y 128, como se puede observar en la tabla de complemento a dos de 8 bits.

Un método más sencillo para obtener la negación de un número en complemento a dos es el siguiente:

Método dos:

  1. Invierte todos los bits del número. Esto da como resultado lo mismo que restar de menos uno.
  2. Añade uno

Ejemplo: para +2, que es 00000010 en binario (el carácter ~ es el operador NOT bit a bit de C , por lo que ~X significa "invertir todos los bits en X"):

  1. ~ 0000001011111101
  2. 11111101 + 1 → 11111110 (−2 en complemento a dos)

Desplazamiento binario

En la representación binaria con desplazamiento , también llamada exceso- K o sesgada , un número con signo se representa mediante el patrón de bits correspondiente al número sin signo más K , donde K es el valor de sesgo o desplazamiento . Así, 0 se representa mediante K , y −K se representa mediante un patrón de bits completamente cero. Esto puede considerarse una ligera modificación y generalización del complemento a dos mencionado anteriormente, que es prácticamente la representación de exceso- ( 2N −1 ) con el bit más significativo negado .

Las representaciones sesgadas se utilizan ahora principalmente para el exponente de números de punto flotante . El estándar de punto flotante IEEE 754 define el campo del exponente de un número de precisión simple (32 bits) como un campo de exceso-127 de 8 bits . El campo del exponente de doble precisión (64 bits) es un campo de exceso-1023 de 11 bits ; véase sesgo del exponente . También se utilizaba para números decimales codificados en binario como exceso-3 .

Base −2

En la representación en base −2 , un número con signo se representa utilizando un sistema numérico de base −2.

En los sistemas de numeración binarios convencionales, la base es 2; por lo tanto, el bit más a la derecha representa 2⁰ , el siguiente , el siguiente 2² , y así sucesivamente. Sin embargo, también es posible un sistema de numeración binario con base -2. El bit más a la derecha representa (-2) = +1 , el siguiente (-2) ¹ = -2 , el siguiente (-2) ² = +4 , y así sucesivamente, alternando el signo. Los números que se pueden representar con cuatro bits se muestran en la tabla comparativa a continuación.

El rango de números que se pueden representar es asimétrico. Si la palabra tiene un número par de bits, la magnitud del mayor número negativo que se puede representar es el doble que la del mayor número positivo que se puede representar, y viceversa si la palabra tiene un número impar de bits.

Tabla comparativa

La siguiente tabla muestra los números enteros positivos y negativos que se pueden representar utilizando cuatro bits.

La misma tabla, vista desde "dados estos bits binarios, ¿cuál es el número interpretado por el sistema de representación?"

Otros sistemas

La codificación en zigzag de Protocol Buffers de Google es un sistema similar al de signo-magnitud, pero utiliza el bit menos significativo para representar el signo y tiene una única representación de cero. Esto permite que una codificación de cantidad de longitud variable, diseñada para enteros no negativos (sin signo), se utilice de manera eficiente para enteros con signo. [ 11 ]

Un método similar se utiliza en los estándares de compresión de vídeo Advanced Video Coding/H.264 y High Efficiency Video Coding/H.265 para extender la codificación exponencial-Golomb a números negativos. En esta extensión, el bit menos significativo es casi un bit de signo; el cero tiene el mismo bit menos significativo (0) que todos los números negativos. Esta elección da como resultado que el número positivo representable de mayor magnitud sea uno mayor que el número negativo de mayor magnitud, a diferencia del complemento a dos o la codificación zigzag de Protocol Buffers.

Otro enfoque consiste en asignar un signo a cada dígito , obteniendo así la representación de dígitos con signo . Por ejemplo, en 1726, John Colson abogó por reducir las expresiones a "números pequeños", los numerales 1, 2, 3, 4 y 5. En 1840, Augustin Cauchy también expresó su preferencia por estos números decimales modificados para reducir los errores de cálculo.

Véase también

Referencias

  1. Choo, Hunsoo; Muhammad, K.; Roy, K. (febrero de 2003). "Multiplicador de compartición de computación en complemento a dos y sus aplicaciones a DFE de alto rendimiento" . IEEE Transactions on Signal Processing . 51 (2): 458– 469. Bibcode : 2003ITSP...51..458C . doi : 10.1109/TSP.2002.806984 .
  2. Manual de referencia de programación GE-625 / 635. General Electric . Enero de 1966. Consultado el 15 de agosto de 2013 .
  3. Manual del desarrollador de software para arquitecturas Intel 64 e IA-32 (PDF) . Intel . Sección 4.2.1 . Consultado el 6 de agosto de 2013 .
  4. Power ISA Versión 2.07 (PDF) . Power.org . Sección 1.4 . Consultado el 2 de noviembre de 2023 .,
  5. Bacon, Jason W. (2010–2011). "Apuntes de clase de Ciencias de la Computación 315" . Archivado del original el 14 de febrero de 2020. Recuperado el 21 de febrero de 2020 .
  6. US 4484301 , "Multiplicador de matriz que opera en formato de complemento a uno", emitido el 10 de marzo de 1981 
  7. US 6760440 , "Combinador criptográfico de complemento a uno", emitido el 11 de diciembre de 1999 
  8. Shedletsky, John J. (1977). "Comentario sobre el comportamiento secuencial e indeterminado de un sumador de acarreo de extremo a extremo". IEEE Transactions on Computers . 26 (3): 271– 272. doi : 10.1109/TC.1977.1674817 . S2CID 14661474 . 
  9. Knuth, Donald . "Capítulo 4.1". El arte de la programación informática . Vol. 2: Algoritmos seminuméricos. 
  10. Thomas Finley (abril de 2000). "Complemento a dos" . Universidad de Cornell . Consultado el 15 de septiembre de 2015 .
  11. Protocol Buffers: Enteros con signo
  • Ivan Flores, La lógica de la aritmética computacional , Prentice-Hall (1963)
  • Israel Koren, Algoritmos aritméticos informáticos , AK Peters (2002), ISBN 1-56881-160-8