stringtranslate.com

Representaciones de números firmados

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

En matemáticas , los números negativos en cualquier base se representan anteponiéndolos con un signo menos ("-"). Sin embargo, en los registros de la RAM o 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 de numeración binaria para representar números con signo son: signo-magnitud, complemento a uno, complemento a dos y binario compensado. Algunos de los métodos alternativos utilizan signos implícitos en lugar de explícitos, como el binario negativo, que utiliza la base −2. Se pueden idear métodos correspondientes para otras bases , ya sean elaboraciones positivas, negativas, fraccionarias u otras elaboraciones sobre dichos temas.

No existe un criterio definitivo por el cual alguna de las representaciones sea 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 mainframes de la serie Unisys ClearPath Dorado utilizan el complemento a uno.

Historia

Los primeros días de la informática digital estuvieron marcados por ideas contrapuestas tanto sobre la tecnología de hardware como sobre la tecnología matemática (sistemas de numeración). Uno de los grandes debates fue el formato de las cifras negativas, y algunos de los principales expertos de la época expresaron opiniones muy fuertes y diferentes. [ cita necesaria ] Un campo apoyó el complemento a dos , el sistema que domina hoy. Otro campo apoyó el complemento a uno, donde se forma un valor negativo invirtiendo todos los bits en su equivalente positivo. Un tercer grupo apoyaba el signo-magnitud, donde un valor se cambia de positivo a negativo simplemente alternando el bit de mayor orden de la palabra.

Hubo argumentos a favor y en contra de cada uno de los sistemas. El signo-magnitud permitió un seguimiento más fácil de los volcados de memoria (un proceso común en la década de 1960), ya que los valores numéricos pequeños utilizan menos bits 1. Estos sistemas hacían matemáticas en complemento de uno internamente, por lo que los números tendrían que convertirse a valores de complemento de uno cuando se transmitían desde un registro a la unidad matemática y luego se volvían a convertir a signo-magnitud cuando el resultado se transmitía de nuevo al registro. La electrónica requería más puertas que los otros sistemas, una preocupación clave cuando el costo y el empaquetado de los transistores discretos eran críticos. IBM fue uno de los primeros defensores del signo-magnitud, siendo sus computadoras de las series 704 , 709 y 709x quizás los sistemas más conocidos en utilizarlo.

El complemento a unos permitió diseños de hardware algo más simples, ya que no había necesidad de convertir valores cuando se pasaban hacia y desde la unidad matemática. Pero también compartía una característica indeseable con el signo-magnitud: la capacidad de representar cero negativo (-0). El cero negativo se comporta exactamente como el cero positivo: cuando se utiliza 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 cuando se verifica la igualdad con cero. La resta del complemento a uno también puede resultar en un préstamo final (que se describe a continuación). Se puede argumentar que esto complica la lógica de suma y resta o la simplifica, ya que una resta requiere simplemente invertir los bits del segundo operando a medida que se pasa al sumador. Las series PDP-1 , CDC 160 , CDC 3000 , CDC 6000 , UNIVAC 1100 y la computadora LINC utilizan representación en complemento de 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 amplia popularidad. [1] Los procesadores de las primeras mainframes a menudo consistían en miles de transistores, por lo que eliminar una cantidad significativa de transistores supuso un importante ahorro de costos. Los mainframes como el IBM System/360 , la serie GE-600 , [2] y el PDP-6 y el PDP-10 utilizan complemento a dos, al igual que los miniordenadores como el PDP-5 y el PDP-8 y el PDP-11 y Máquinas VAX . Los arquitectos de las primeras CPU basadas en circuitos integrados ( Intel 8080 , etc.) también optaron por utilizar matemáticas en complemento a dos. A medida que avanzaba la tecnología IC, se adoptó la tecnología de complemento a dos 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 de signo-magnitud , también llamada signo y magnitud o magnitud con signo , un número con signo está representado por 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 a 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 , sólo siete bits representan la magnitud, que puede oscilar entre 0000000 (0) y 1111111 (127). Por lo tanto, los números que van desde −127 10 a +127 10 se pueden representar 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 de signo y magnitud tiene múltiples consecuencias, lo que hace que su implementación sea más compleja: [5]

  1. Hay dos formas de representar 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 hacer un acarreo final, 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, uno puede simplemente restar los dos números y verificar 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 enfoque es directamente comparable a la forma común de mostrar un signo (colocando un "+" o "-" al lado de la magnitud del número). Algunas de las primeras computadoras binarias (por ejemplo, IBM 7090 ) usan esta representación, quizás debido a su relación natural con el uso común. El signo-magnitud es la forma más común de representar el significado en valores de punto flotante .

complemento de unos

En la representación en complemento a unos , [6] un número negativo está representado por el patrón de bits correspondiente al NOT bit a bit (es decir, el "complemento") del número positivo. Al igual que la representación de signo-magnitud, el complemento a uno tiene dos representaciones de 0: 00000000 (+0) y 11111111 ( -0 ). [7]

Como ejemplo, la forma de complemento a unos 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 , siendo el cero 00000000 (+0) o 11111111 (−0).

Para sumar dos números representados en este sistema, se hace una suma binaria convencional, pero luego es necesario hacer un acarreo final : es decir, sumar cualquier acarreo resultante 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):

 decimal binario 11111110-1+ 00000010 +2─────────── ── 1 00000000 0 ← No es la respuesta correcta 1 +1 ← Añadir 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 agregar el acarreo.

Una observación sobre la terminología: El sistema se conoce como "complemento a uno" porque la negación de un valor positivo x (representado como el NOT bit a bit de x ) también se puede formar restando x de la representación en complemento a uno de cero, es decir una larga secuencia de unos (−0). La aritmética en complemento a dos, por otro lado, forma la negación de x restando x de una sola 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.

Tenga en cuenta que la representación en complemento a unos 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 de signo y magnitud 11111101 se puede representar en forma de complemento a uno como 10000010.

complemento a dos

En la representación en complemento a dos , un número negativo está representado por el patrón de bits correspondiente al NOT bit a bit (es decir, el "complemento") del número positivo más uno, es decir, al complemento a unos más uno. Evita los problemas de las representaciones múltiples de 0 y la necesidad del acarreo final de la representación en complemento de unos. También se puede considerar 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 el lugar 128, donde 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 realiza invirtiendo todos los bits y luego sumando uno a ese resultado. [10] Esto en realidad refleja la estructura de anillo en todos los números enteros módulo 2 N : . La suma de un par de enteros en complemento a dos es lo mismo que la suma de un par de números sin signo (excepto para la detección de desbordamiento , si se hace); Lo mismo ocurre con la resta e incluso con los N bits significativos más bajos de un producto (valor de multiplicación). Por ejemplo, una suma en complemento a dos de 127 y −128 da el mismo patrón de bits binarios que una suma sin signo de 127 y 128, como se puede ver 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 a través del número.
  2. Agrega 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. ~00000010 → 11111101
  2. 11111101 + 1 → 11111110 (−2 en complemento a dos)

binario compensado

En la representación binaria compensada , también llamada exceso de K o sesgada , un número con signo está representado por el patrón de bits correspondiente al número sin signo más K , siendo K el valor de polarización o compensación . Por lo tanto, 0 está representado por K y − K está representado por un patrón de bits todo cero. Esto puede verse como una ligera modificación y generalización del complemento a dos antes mencionado, que es prácticamente la representación en exceso (2 N −1 ) con el bit más significativo negado .

Las representaciones sesgadas ahora se utilizan principalmente para el exponente de números de punto flotante . El estándar de punto flotante IEEE 754 define el campo exponente de un número de precisión simple (32 bits) como un campo de 8 bits con exceso de 127 . El campo exponente de doble precisión (64 bits) es un campo con exceso de 1023 de 11 bits; ver sesgo exponencial . También se usaba 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 con base −2. En los sistemas numéricos binarios convencionales, la base, o base , es 2; por lo tanto, el bit más a la derecha representa 2 0 , el siguiente bit representa 2 1 , el siguiente bit 2 2 , y así sucesivamente. Sin embargo, también es posible un sistema numérico binario con base −2. El bit más a la derecha representa (−2) 0 = +1 , el siguiente bit representa (−2) 1 = −2 , el siguiente bit (−2) 2 = +4 y así sucesivamente, con signo alterno. Los números que se pueden representar con cuatro bits se muestran en la siguiente tabla comparativa.

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 el mayor número positivo que se puede representar, y viceversa si la palabra tiene un número impar de bits.

Tabla de comparación

La siguiente tabla muestra los números enteros positivos y negativos que se pueden representar usando 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 zig-zag" de Protocol Buffers de Google es un sistema similar al signo-magnitud, pero utiliza el bit menos significativo para representar el signo y tiene una representación única de cero. Esto permite utilizar de manera eficiente una codificación de cantidad de longitud variable destinada a enteros no negativos (sin signo) para enteros con signo. [11]

Se utiliza un método similar en los estándares de compresión de video Advanced Video Coding/H.264 y High Efficiency Video Coding/H.265 para extender la codificación de Golomb exponencial a números negativos. En esa 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 en zig-zag de Protocol Buffers.

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

Ver también

Referencias

  1. ^ Choo, Hunsoo; Mahoma, K.; Roy, K. (febrero de 2003). "Multiplicador de intercambio de cálculo en complemento a dos y sus aplicaciones al DFE de alto rendimiento". Transacciones IEEE sobre procesamiento de señales . 51 (2): 458–469. Código Bib : 2003ITSP...51..458C. doi :10.1109/TSP.2002.806984.
  2. ^ Manual de referencia de programación GE-625/635. Energia General . Enero de 1966 . Consultado el 15 de agosto de 2013 .
  3. ^ Manual del desarrollador de software de 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. ^ Tocino, Jason W. (2010-2011). "Notas de la conferencia de Ciencias de la Computación 315". Archivado desde el original el 14 de febrero de 2020 . Consultado el 21 de febrero de 2020 .
  6. ^ US 4484301, "Multiplicador de matriz que funciona en formato de complemento a uno", publicado el 10 de marzo de 1981 
  7. ^ US 6760440, "Combinador criptográfico en 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 final". Transacciones IEEE en computadoras . 26 (3): 271–272. doi :10.1109/TC.1977.1674817. S2CID  14661474.
  9. ^ Donald Knuth: El arte de la programación informática , Volumen 2: Algoritmos seminuméricos, capítulo 4.1
  10. ^ Thomas Finley (abril de 2000). "Complemento a dos". Universidad de Cornell . Consultado el 15 de septiembre de 2015 .
  11. ^ Búfers de protocolo: enteros con signo