lunes, 29 de abril de 2013

REPRESENTACIÓN DE NÚMEROS NEGATIVOS


SIGNO Y MAGNITUD

Normalmente utilizamos el símbolo “-” precediendo a un número para indicar que este es menor que cero. Esta es una notación muy práctica en la vida cotidiana pero no puede ser utilizada en la representación que se hace de los números en una computadora, recordemos que Es solo se pueden utilizar los dígitos binarios para representar cualquier cosa en ellas y el “-” no es ningún bit.

Pero podemos utilizar la misma idea, preceder el número de un bit que indique su signo, después de todo solo hay dos posibles signos, a saber: “+”y “-”. Todo lo que tenemos que hacer es asignar arbitrariamente un bit a cada signo. Convencionalmente se hace: “+” = 0, “-” = 1.

A este método de representación de números negativos se le denomina signo y magnitud porque, análogamente a lo que solemos hacer, se coloca un símbolo que precede al número y10 Representación de números negativos que indica su signo y luego se pone la magnitud del número.
En esta notación por ejemplo:
1 010102 = −1010

De esta manera es muy fácil distinguir los números positivos de los negativos, si utilizamos un número fijo de bits para representarlos y decidimos que siempre el primer bit es para el signo del número, entonces basta con observar el primer bit de la izquierda (al que en este caso no podemos decirle formalmente “el más significativo”, dado que no tiene asociada ninguna potencia de 2) para determinar si se trata de un número negativo o positivo.

En este caso la “multiplicación por -1” de un número equivale a negar o invertir el bit de la extrema izquierda, esto es, convertirlo en cero si vale 1 y viceversa. De hecho la idea fundamental detrás de la representación de signo y magnitud es que ocurra: −(−a) = a. Lo que nos parece evidente por estar acostumbrados a nuestra representación de números negativos convencional.
Un inconveniente del sistema de signo y magnitud es que existen dos representaciones distintas para el cero, es decir, el neutro aditivo no es ´único formalmente hablando, tanto el 10. . .0 como el 00. . .0 son cero, el primero con signo “-”y el segundo con signo “+”, lo que tampoco es correcto desde el punto de vista matemático, dado que el cero no es ni positivo ni negativo.

Esta dualidad del cero tiene implicaciones importantes en una computadora digital. Los procesadores tienen generalmente instrucciones para cambiar al flujo de los programas llamadas saltos, hay saltos incondicionales (siempre que el procesador ejecuta la instrucción de salto la siguiente instrucción es aquella indicada por el salto) y hay saltos condicionales (la instrucción siguiente es a veces la que está bajo la del salto y a veces la indicada por el salto dependiendo de alguna condición). Y generalmente la condición de salto es establecida comparando algún dato con cero. Si hay dos representaciones del cero hay que hacer dos comparaciones y eso lleva más tiempo que hacer solo una.

COMPLEMENTO A 1
Otra manera de representar números negativos es la conocida como complemento a 1. Para hablar de ella primero trataremos con una generalización.

Dentición:
El complemento a b − 1 de un número r, representado en k dígitos en base b se define como:

Cb−1(rb) = (b − 1k . . . b − 11) − rb2.2 Complemento a 1 11 donde b − 1 es el valor máximo de un digito en base b.
Por ejemplo el complemento a 9 del número 1357910 es: C9(1357910) = 99999 − 13579 = 8642010 nótese que el minuendo que se ha usado tiene tantos nueves como dígitos tiene el número 13579.

En el caso de nuestro sistema binario hablaremos del complemento a 1 del número n en k bits como el resultado de restar n al número constituido por k unos.

Por ejemplo:
C1(011012) = 11111 − 01101 = 100102

nótese que cada bit del resultado es el negado del número original. De hecho esta es la receta práctica para obtener el complemento a 1 de cualquier número binario rápidamente.

Receta: El complemento a uno de un número binario n2 se obtiene invirtiendo cada bit de n2.
Por ejemplo:
C1(100101101112) = 011010010002

Una alternativa de representación de números negativos en la computadora es utilizando el complemento a 1, es decir, el negativo de un número es su complemento a 1.
Por ejemplo: 1010 = 010102 −1010 = 101012
Al igual que en el caso de signo y magnitud se adopta la convención de que todos los números cuyo bit del extremo izquierdo sea cero son positivos y por ende, todos aquellos cuyo bit del extremo izquierdo es 1 son negativos.

Nuevamente, como en signo y magnitud, la idea es que −(−a) = a. También tenemos el problema de que hay dos distintas representaciones para el cero: 0. . .0 y 1. . .1. El primero es un cero con signo “+”y el segundo un cero con signo “-”.

También hay que notar que tenemos tantos números positivos como negativos, tanto en signo y magnitud como en complemento a 1. Supongamos que se utilizan k bits para representar nuestros números enteros en una computadora. ¿Cuantos números representables tenemos? bueno, si tengo k lugares en los que puedo poner 0 ´o 1 y cada vez que elijo el lugar i tengo esas dos posibilidades para el lugar i + 1 entonces tengo en total 2k combinaciones,12 representación de números negativos es decir, números representables, ahora bien, ¿cuántos de estos 2k números son negativos (o mejor dicho tienen signo “-”)? tanto en complemento a 1 como en signo y magnitud los que tienen signo “-” son aquellos que empiezan con 1 que son justamente la mitad de todos nuestros números, es decir 2k−1, lo mismo ocurre con los que tienen signo “+”, también son  2  k−1.

COMPLEMENTO A 2
Ya mencionamos el inconveniente que haya dos representaciones diferentes del cero en el contexto de nuestras computadoras digitales. Para evitar esto (que sin embargo se puede sobrellevar), se inventó otro mecanismo para representar números negativos, se denomina complemento a 2, eso nos lleva a considerar, en general, el complemento a la base.

Dentición 2 :
El complemento a b de un número r, representado en k dígitos en base b se define como:

Cb(rb) = (1 0k . . .01) – rb nótese que el número que se utiliza ahora como minuendo tiene un digito más que los usados en la representación, es decir tiene k + 1 dígitos, un 1 seguido de k ceros a la derecha.

Por ejemplo, el complemento a 10 de 1357910 es:
C10(1357910) = 100000 − 13579 = 8642110
el resultado es, evidentemente, el mismo que se obtuvo en el complemento a 9 incrementado en uno, es decir: Cb(xb) = Cb−1(xb) + 1.
En el caso particular de base 2, el complemento a 2 de un número x2 es el resultado de
sumar 1 al complemento a 1 de x2 que, como vimos, no es otro que el número negado bit a
bit.

Por ejemplo1: C2(011012) = 10010 + 00001 = 100112
También existe una receta rápida para obtener el complemento a 2 de un número binario. Receta: El complemento a 2 del número x2 se obtiene copiando, de derecha a izquierda, todos los bits de x2 hasta encontrar el primer 1 inclusive e invertir todos los bits restantes hacia la izquierda. 1En este ejemplo no ocurre, pero pudiera ser que al sumar dos dígitos binarios ambos fueran 1, el resultado en este caso seria 210 = 102, por lo que se colocaría, a la manera de una suma convencional en base 10, el digito menos significativo y el otro se lleva como acarreo.2.4 Exceso 13

Por ejemplo:
C2(00110011 1002) = 11001100 1002
Entonces es posible representar el negativo de un número binario como su complemento a 2. La idea detrás de esta representación es que: a + (−a) = 0. Un número más su negativo, que es de hecho su inverso aditivo, nos da cero, un ´único cero. A diferencia de signo y magnitud y de complemento a 1, en la representación en complemento a 2 de números negativos tenemos una sola representación de cero, a saber: 0. . .0. Esta vez el negativo, es decir el complemento a 2, de 0. . .0 es justamente 0. . .0.

Además conservamos la ventajosa propiedad exhibida por signo y magnitud y complemento a 1 de poder determinar facialmente si un número es negativo o positivo observando el bit del extremo izquierdo.
Sin embargo no todo es perfecto, tenemos una desventaja. Concluimos que hay una sola representación de cero en complemento a 2 en k bits, eso está bien, ahora ¿cuántos números negativos se pueden representar? todos los números de k bits que empiezan con 1, es decir 2k−1, ¿cuantos números positivos se pueden representar? pues también hay 2k−1 que empiezan con cero, pero uno de ellos es el cero (0. . .0), hay entonces exactamente 2 k−1 − 1 números positivos. ¡Aja! hay un número negativo, el más grande en magnitud, 10. . .0, que no tiene su inverso aditivo en el conjunto de 2k posibles números.
Por ejemplo,
en cuatro bits:
C2(01002) = 11002
dónde: 01002 = 410 y 11002 = −410, porque 0100 + 1100 = 00002.
En cambio: C2(10002) = 100002 lo que es un error.

Por ejemplo, en una computadora que utilice, como es común, 16 bits para representar ciertos enteros con signo2, el número más grande positivo representable es 32767 y el más grande negativo es -32768 que no posee su inverso aditivo en el conjunto {−32768, . . . ,32767}.

EXCESO
Otro mecanismo para representar números negativos es el conocido como exceso a x. Si el número de bits usados para representar enteros es k entonces generalmente x = 2k−1 o x = 2k−1 − 1. Por ejemplo, si se utilizan 8 bits para representar enteros entonces el 2Como el tipo short de Java14 representación de números negativos sistema utilizado podría ser exceso a 128 o bien exceso a 127. La idea del sistema es que, para representar el número n en k bits se le suma a n, el valor del exceso (esto es 2 k−1 o 2k−1 − 1), obteniéndose n + e entonces n se escribe como n + e en binario (ya sin consideraciones de signo por supuesto). Por ejemplo, para escribir en 8 bits el número −10010 en exceso a 28−1 = 27 = 128 hacemos: −100+ 128 = 2810, esto en binario se escribe: 000111002 (16+8+4), por lo que, en exceso a 128 en 8 bits −10010 = 000111002. En cambio, usando las mismas condiciones (8 bits, exceso a 128): 100 + 128 = 22810 = 111001002, es
decir: 10010 = 111001002. Nuevamente hay un solo cero (en exceso a 128 en 8 bits seria 100000002), lo que significa, dado que la cantidad de números representables en k bits es par, que hay un negativo o un positivo “de más”, en nuestro ejemplo es el −128 (porque su inverso aditivo seria 128 y 128 + 128 = 256, que no se puede escribir en 8 bits), el único cero es 100000002 y el rango de representatividad es: {−128, . . . ,127}, cabe señalar que los números en exceso a 2k−1 y en complemento a 2 se escriben igual salvo el bit más significativo.

Para saber entonces que número está siendo representado por una cadena de bits debemos saber el valor del exceso. Si nos topamos con un 011011012 y se nos dice que está representando a un número en exceso a 128 entonces sabemos que al valor del número sin consideraciones de signo (10910) se le debe restar un 128 para determinar su verdadero valor, es decir nuestra cadena 011011012 está representando al número 10910 − 12810 = −1910.

En exceso a 2k−1 − 1 se hace lo mismo, solo que el número a sumar es, por supuesto n = 2k−1 − 1. Si se utilizan 8 bits en la representación, el sistema seria exceso a 127, este caso particular nos resultará ´útil cuando consideremos la representación de números en punto flotante. En exceso a 127 en ocho bits un número n es representado como la cadena de bits que le correspondería al número n+127 en binario. Por ejemplo nuestro −1910 anterior se escribiría como −19 + 127 = 10810 = 011011002, el cero seria 011111112 el −12710 = 000000002 el 12710 = 111111102 y el 12810 = 111111112, este ´último es el que no posee su inverso (−128) en el rango de representatividad del sistema que resulta ser {−127, . . . ,128}. Nótese que el número negativo más grande es representado como una cadena de ceros.

No hay comentarios:

Publicar un comentario