Representación de números con signo

En matemáticas, los números negativos en cualquier base se representan del modo habitual, precediéndolos con un signo «−». Sin embargo, en una computadora hay varias formas de representar el signo de un número. Este artículo trata cuatro métodos de extender el sistema binario para representar números con signo: signo y magnitud, complemento a uno, complemento a dos y exceso K, donde normalmente K equivale a bn-1.

Para la mayoría de usos, las computadoras modernas utilizan típicamente la representación en complemento a dos, aunque pueden usarse otras en algunas circunstancias.

En las secciones siguientes nos referiremos exclusivamente al caso de números signados en binario (y contrastaremos con el decimal con fines didácticos), esto no significa que lo mostrado aquí se pueda llevar en forma análoga a otras bases ( hexadecimal, u octal, por ejemplo). El valor absoluto de un número es la distancia que lo separa del cero en la recta numérica. decimos también que es el propio número tras prescindir de su signo.El valor absoluto se escribe entre barras: | |. Valor absoluto de 3:|3| =3. El valor absoluto de -3: |-3| =3.Los números menores que cero son por supuesto los números negativos.

el numero que tiene como valor absoluto 125 y es menor que cero es -125 porque; el valor absoluto solo toma en cuenta la distancia no la dirección razón por la cual este solo puede ser positivo o cero.

Para n = 8 (8 bits) en Signo y Magnitud
Número Binario de 8 bits Interpretado como número entero en Sistema Decimal Interpretado como número natural en Sistema Decimal
00000000 0 0
00000001 1 1
00000010 2 2
... ... ...
01111110 126 126
01111111 127 127
10000000 -0 128
10000001 −1 129
10000010 −2 130
... ... ...
11111101 −125 253
11111110 −126 254
11111111 −127 255

Un primer enfoque al problema de representar un número signado de n- bits consiste en asignar:

  1. un bit para representar el signo. Ese bit a menudo es el bit más significativo o MSB (de sus siglas en inglés) y, por convención: un 0 denota un número positivo, y un 1 denota un número negativo;
  2. los (n-1)-bits restantes para representar el significando que es la magnitud del número en valor absoluto.

Y se conoce como Signo y Magnitud.

Este enfoque es directamente comparable a la forma habitual de mostrar el signo (colocando "+" o "-" al lado de la magnitud del número). Algunas de las primeras computadoras binarias (la IBM 7090) utilizaron esta representación, quizás por su relación obvia con la práctica habitual.

El formato Signo y Magnitud es además el habitual para la representación del significando en números en punto flotante.

Ejemplo de Signo y Magnitud

Sea una representación en formato de Signo y Magnitud que nos permite codificar un número entero en binario con 8 bits (un byte). Esto nos otorga 1 bit para el signo y 7 bits para la magnitud. Con 8 bits, podemos representar, en teoría al menos (véase Desventajas, más abajo), 28 = 256 números. Los cuales, según este formato, van a estar repartidos entre 128 números positivos (bit de signo en 0) y 128 números negativos (bit de signo en 1).

Supongamos ahora, que tenemos que representar el número -9710 (decimal). Procedemos a:

  1. Tomar nota del signo del número reducido o simplificado -9710, que siendo negativo, llevará como bit de signo un 1;
  2. Realizar la conversión: el valor absoluto de -9710 es |-9710| = 9710. Que en binario es: 11000012;
  3. Colocar todo junto, el número -9710 en binario con formato de Signo y Magnitud es: 111000012. Donde el 1 en el bit más significativo indica un número negativo, y 11000012 es el significando en valor absoluto.

Para el caso inverso, dado un número binario en Signo y Magnitud, por ejemplo, 101101012, procedemos a:

  1. Analizar el bit más significativo, que siendo un 1 indica que el número es negativo;
  2. Convertir el significando a la base deseada, por ejemplo, en decimal, tomando en cuenta que el valor obtenido está en valor absoluto y la magnitud real estará dada por el bit de signo obtenido antes: 01101012 = |5310|. Siendo que el bit de signo es 1, el número real es -5310. Si el bit de signo fuese 0, el número hubiese sido +5310.

Desventajas de la representación en Signo y Magnitud

Siguiendo con el ejemplo de n = 8 (8 bits).

  • Es más complejo operar aritméticamente. Para realizar una suma, por ejemplo, primero hay que determinar si los dos números tienen el mismo signo, y en caso de que sea así, realizar la suma de la parte significativa, pero en caso contrario, restar el mayor del menor y asignar el signo del mayor.
  • Posee doble representación del cero. Al representar en Signo y Magnitud, aparece el cero signado: 000000002 (+010) y 100000002 (-010).

Ventajas de la representación en signo y magnitud

Siguiendo con el ejemplo de n = 8 (8 bits).

  • Posee un rango simétrico: los números van del +12710 = 011111112, pasando por el +010 = 000000002 y el -010 = 100000002, hasta el -12710 = 111111112. Y en forma general, para n-bits, el rango (en decimal) para Signo y Magnitud es (-2n-1+1; 2n-1-1), o bien ± (2n-1-1).

Complemento a la base menos uno

Para n = 8 (8 bits) en Complemento a uno
Valores de 8 bits Interpretado en Complemento a uno en decimal Interpretado como Entero sin signo en decimal
00000000 0 0
00000001 1 1
00000010 2 2
... ... ...
01111110 126 126
01111111 127 127
10000000 −127 128
10000001 −126 129
10000010 −125 130
... ... ...
11111101 −2 253
11111110 −1 254
11111111 −0 255

Otro enfoque sería representar números negativos usando el complemento a la base menos uno. En el caso de los números binarios, sería el complemento a uno y la forma del complemento a uno de un número binario es un NOT bit a bit aplicado al número, es decir, la inversión de unos por ceros y ceros por unos. De esta forma, en la representación por Complemento a uno de un número signado de n-bits asignamos:

  1. un bit para representar el signo. Ese bit a menudo es el bit más significativo y, por convención: un 0 denota un número positivo, y un 1 denota un número negativo;
  2. los (n-1)-bits restantes para representar el significando que es la magnitud del número en valor absoluto para el caso de números positivos, o bien, en el complemento a uno del valor absoluto del número, en caso de ser negativo.

Observar así que la representación en Complemento a uno de un número negativo se puede obtener de la representación en Signo y Magnitud por una mera inversión de unos por ceros y ceros por unos del significando.

Este sistema numérico de representación era común en computadoras más antiguas; el PDP-1 y la serie de UNIVAC 1100/2200, entre muchas otras, utilizaron la aritmética en complemento a uno.

Ejemplo de complemento a uno

Sea una representación en formato de Complemento a uno que nos permite codificar en binario en punto fijo con 8 bits (un byte). Al igual que con la representación en Signo y Magnitud, esto nos otorga 1 bit para el signo y 7 bits para la magnitud. Con 8 bits, podemos representar, en teoría al menos (véase nuevamente Desventajas, más abajo), 28 = 256 números. Los cuales, según este formato, van a estar repartidos entre 128 números positivos (bit de signo en 0) y 128 números negativos (bit de signo en 1).

Supongamos ahora, que tenemos que representar el número -9710. Procedemos a:

  1. Tomar nota del signo del número -9710, que siendo negativo, llevará como bit de signo un 1;
  2. Como el signo es negativo, el número a continuación del bit de signo, deberá expresarse en complemento a uno. Al realizar la conversión: el valor absoluto de -9710 es |-9710| = 9710. Que en binario es: 11000012, y el complemento a uno de 11000012 es C1(1100001) = 00111102;
  3. Colocar todo junto, el número -9710 en binario con formato de Complemento a uno es: 100111102. Donde el 1 en el bit más significativo indica un número negativo, y 00111102 es el significando en complemento a uno del valor absoluto del número.

Para el caso inverso, dado un número binario en Complemento a uno, por ejemplo, 101101012, procedemos a:

  1. Analizar el bit más significativo, que siendo un 1 indica que el número es negativo;
  2. Convertir el significando a la base deseada, por ejemplo, en decimal, tomando en cuenta que: el valor obtenido está en valor absoluto, que la magnitud real estará dada por el bit de signo obtenido antes, y que en caso de ser bit de signo negativo (como es el caso) se deberá obtener el complemento a uno: C1(0110101) = 10010102 = |7410|. Siendo que el bit de signo es 1, el número real es -7410. Si el bit de signo fuese 0, el número hubiese sido 01101012 = +5310 ('sin complementar a uno).

Desventajas de la representación en Complemento a uno

Siguiendo con el ejemplo de n = 8 (8 bits).

  • Posee doble representación del cero. Al representar en Complemento a uno, aparece nuevamente el cero signado: 000000002 (+010) y 111111112 (-010).

Ventajas de la representación en Complemento a uno

Siguiendo con el ejemplo de n = 8 (8 bits).

  • Posee un rango simétrico: los números van del +12710 = 011111112, pasando por el +010 = 000000002 y el -010 = 111111112, hasta el -12710 = 100000002. Y en forma general, para n-bits, el rango (en decimal) para Complemento a uno es (-(2n-1-1); 2n-1-1), o bien ± 2n-1-1.
  • Permite operar aritméticamente. NOTA: al operar se debe sumar el acarreo obtenido al final de la adición/resta realizadas (conocido como end-around carry), en caso de haberlo obtenido, para conseguir el resultado correcto. Por ejemplo: 000101012 + 100111102 = 101100112 (+2110 + -9710 = -7610) puesto que el end-around carry es cero; pero, 000000102 + 111111102 = 1000000002 (+210 + -110 = -010 ≠ +110), que corregimos mediante 000000102 + 111111102 = 000000002 + 12 = 000000012, que es el resultado correcto.

Los protocolos de Internet IPv4, ICMP, UDP y TCP usan todos el mismo algoritmo de suma de verificación de 16 bits en complemento a uno. Aunque la mayoría de la computadoras carecen del hardware para manejar acarreo del último bit (end-around carry), la complejidad adicional es aceptada ya que es igualmente sensible a errores en todas las posiciones de bits. En UDP, una representación de todos ceros indica que la suma de verificación opcional ha sido omitida. La otra representación, todos unos, indica un valor 0 en la suma de verificación (las sumas de verificación son obligatorias para IPv4, TCP e ICMP; fueron omitidas en IPv6).