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.