SIGNO Y MAGNITUD 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 en binario en punto fijo 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 éste 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 -97 10 (decimal). Procedemos a: 1. Tomar nota del signo del número -97 10, que siendo negativo, llevará como bit de signo un 1; 2. Realizar la conversión: el valor absoluto de -97 10 es |-9710| = 9710. Que en binario es: 11000012; 3. Colocar todo junto, el número -97 10 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: 0110101 2 =
1
|5310|. Siendo que el bit de signo es 1, el número real es -53 10. 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).
No permite operar aritméticamente. De intentar hacer una suma sencilla de un número positivo y uno negativo, se obtienen resultados incorrectos. Por ejemplo: 000101012 + 111000012 = 111101102 (+2110 + -9710 = -11810 ≠ -7610). 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 +127 10 = 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 dos Otro enfoque sería representar números negativos usando el complemento a la base. En el caso de los números binarios, sería el complemento a dos y la forma de obtener el complemento a dos de un número binario es mediante la obtención del complemento a uno y sumarle uno, o bien: Ejemplo Ejemplo 2 1 1. Empezando desde la derecha encontramos 0101001 0101100 el primer '1' 2. Hacemos un NOT a todos los bits que 1010111 1010100 quedan por la izquierda De esta forma, en la representación por Complemento a dos 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 2
números positivos, o bien, en el complemento a dos del valor absoluto del número, en caso de ser negativo. Observar así que la representación en Complemento a dos 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, y sumarle uno al valor obtenido. Ejemplo de Complemento a dos Sea una representación en formato de Complemento a dos 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, y Complemento a uno, esto nos otorga 1 bit para el signo y 7 bits para la magnitud. Con 8 bits, podemos representar, 2 8 = 256 números. Los cuales, según éste 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 -97 10. 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 dos. Al realizar la conversión: el valor absoluto de -97 10 es |-9710| = 9710. Que en binario es: 1100001 2, y el complemento a uno de 11000012 es C1(1100001) = 0011110 2, le sumamos uno para obtener el complemento a dos: 0011110 2 + 00000012 = 00111112;
Colocar todo junto, el número -97 10 en binario con formato de Complemento a dos es: 100111112. Donde el 1 en el bit más significativo indica un número negativo, y 00111112 es el significando en complemento a dos del valor absoluto del número.
Para el caso inverso, dado un número binario en Complemento a dos, por ejemplo, 101101012, procedemos a: 1. Analizar el bit más significativo, que siendo un 1 indica que el número es negativo;
3
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 dos: C2(0110101) = C1(0110101) + 0000001 2, luego C1(0110101) = 10010102, y al sumarle 1, 10010112 = |7510|. Siendo que el bit de signo es 1, el número real es -75 10. Si el bit de signo fuese 0, el número hubiese sido 0110101 2 = +5310 (sin complementar a dos). Desventajas de la representación en Complemento a dos Siguiendo con el ejemplo de n = 8 (8 bits).
Posee un rango asimétrico: los números van del +127 10 011111112, pasando por el +010, 000000002. Y aquí aparece la primera diferencia, el 111111112, ya no es -010 como en la representación anterior, sino que es -1 10, y al llegar al 100000002 nos encontramos con que el complemento a dos de 100000002 es 100000002, ¡el mismo número!. Por convención, se asigna a este número particular el valor -128 2 (para 8 bits). Luego, en forma general, para n-bits, el rango (en decimal) para Complemento a dos es (-2n-1; 2n-1-1).
Ventajas de la representación en Complemento a dos Siguiendo con el ejemplo de n = 8 (8 bits).
No posee doble representación del cero. Permite operar aritméticamente.
4