Chapter 4: Testing the Argument
V. Theoretical Analysis
El sistema más popular para la representación de enteros en las computadoras actuales es la notación en complemento a dos. Este sistema utiliza un número fijo de bits para representar cada uno de los valores del sistema. En los equipos actuales, es habitual utilizar un sistema de complemento a dos en el que cada valor está representado por un patrón de 32 bits. Un sistema de tamaño tan grande permite representar un amplio rango de números, pero resulta bastante incómodo para la realización de ejemplos. Por tanto, de cara a estudiar las pro- piedades de los sistemas en complemento a dos, nos vamos a centrar en siste- mas de menor tamaño.
En la Figura 1.21 se muestran dos sistemas completos de complemento a dos: uno basado en patrones de bits de longitud igual a tres y el otro basado en patrones de bits de longitud igual a cuatro. Un sistema como estos se construye partiendo de una cadena de 0s de la longitud apropiada y luego contando en binario hasta alcanzar el patrón formado por un único 0 seguido de una serie de 1s. Estos patrones representan los valores 0, 1, 2, 3,... Los patrones que repre- sentan los valores negativos se obtienen comenzando por una cadena de 1s de la longitud apropiada y luego contando hacia abajo en binario hasta obtener el patrón compuesto por un único 1 seguido de 0s. Estos patrones representan los valores ⫺1, ⫺2, ⫺3,... (Si el contar hacia atrás en binario le resulta difícil, comience por la parte inferior de la tabla con el patrón compuesto por un único 1 seguido de 0s, y cuente hacia arriba hasta alcanzar el patrón formado por todo 1s.)
Observe que en un sistema de complemento a dos, el bit de más a la izquierda de cada patrón de bits indica el signo del valor representado. Por ello, el bit de más a la izquierda se suele denominar bit de signo. En un sistema en complemento a dos, los valores negativos se representan mediante patrones cuyo bit de signo es igual a 1; los valores no negativos se representan mediante patrones cuyo bit de signo es igual a 0.
En un sistema en complemento a dos, existe una relación bastante conve- niente entre los patrones que representan los valores positivos y negativos que tienen el mismo módulo. Dicha relación es la siguiente: ambos patrones son idénticos cuando se los lee de derecha a izquierda, hasta llegar al primer 1. A partir de ahí, los patrones son complementarios el uno del otro. (El complemento de un patrón es el patrón que se obtiene cambiando todos los 0s por 1s y todos los 1s por 0s, 0110 y 1001 son complementarios entre sí.) Por
57 1.6 Almacenamiento de enteros
ejemplo, en el sistema de 4 bits de la Figura 1.21 los patrones que representan los valores 2 y ⫺2 terminan ambos en 10, pero el patrón que representa el valor 2 comienza por 00, mientras que el patrón representa el valor ⫺2 comienza por 11. Esta observación nos lleva a un algoritmo para realizar la conversión entre los patrones de bits que representan los valores positivo y negativo de un mismo módulo. Basta con copiar el patrón original de derecha a izquierda hasta copiar el primer 1 y luego complementar los bits restantes antes de transferir- los al patrón final de bits (Figura 1.22).
a. Con patrones de longitud igual a tres b. Con patrones de longitud igual a cuatro
⫺ ⫺ ⫺ ⫺ ⫺ ⫺ ⫺ ⫺ ⫺ ⫺ ⫺ ⫺ Patrón de bits Valor representado Patrón de bits Valor representado
Figura 1.21 Sistemas de notación en complemento a dos.
Notación en complemento a dos para 6 utilizando cuatro bits
Notación en complemento a dos para –6 utilizando cuatro bits
Copiar los bits de derecha a izquierda hasta copiar el primer 1 Complementar los bits restantes
0 1 1 0
1 0 1 0
Comprender estas propiedades básicas de los sistemas en complemento a dos nos permite obtener también un algoritmo para decodificar las representa- ciones en complemento a dos. Si el patrón que hay que decodificar tiene un bit de signo igual a 0, lo único que tendremos que hacer es leer el valor como si el patrón fuera una representación binaria normal y corriente. Por ejemplo, 0110 representa el valor 6, porque 110 es el equivalente binario del valor decimal 6. Si el patrón que hay que decodificar tiene un bit de signo igual a 1, sabemos que el valor representado es negativo y lo único que necesitaremos es encontrar el módulo de dicho valor. Para ello, aplicaremos el procedimiento de “copiar y complementar” mostrado en la Figura 1.22 y luego decodificaremos el patrón obtenido como si fuera una representación binaria normal y corriente. Por ejemplo, para decodificar el patrón 1010, primero vemos que el valor represen- tado es negativo porque el bit de signo es 1. Por ello, aplicamos el procedi- miento de “copia y complemento” para obtener el patrón 0110, pudiendo comprobar que se trata de la representación binaria del valor 6. De este modo, concluimos que el patrón original representa el valor ⫺6.
Suma utilizando la notación en complemento a dos Para sumar valores representa-
dos en notación de complemento a dos aplicamos el mismo algoritmo que ya hemos empleado anteriormente para la suma binaria, salvo por el hecho de que todos los patrones de bits, incluyendo la respuesta, tendrán la misma lon- gitud. Esto quiere decir que cuando se realiza la suma en un sistema de com- plemento a dos, será preciso truncar cualquier bit adicional generado a la izquierda de la respuesta por alguna operación final de acarreo. Por tanto, la “suma” de 0101 y de 0010 es 0111, mientras que la “suma” de 0111 y 1011 da como resultado 0010 (0111 ⫹ 1011 ⫽ 10010, que se trunca a 0010).
Teniendo esto presente, considere los tres problemas de suma mostrados en la Figura 1.23. En cada caso, hemos traducido el problema a la notación de com- plemento a dos (utilizando patrones de bits de longitud igual cuatro), hemos rea- lizado el proceso de suma anteriormente descrito y hemos decodificado el resultado, para obtener el equivalente en nuestra notación usual en base diez.
Observe que el tercer problema de la Figura 1.23 implica la suma de un número positivo y otro negativo, lo que ilustra una de las ventajas principales
Problema en base diez Respuesta en base diez Problema en complemento a dos ⫹ ⫹ ⫺ ⫹ ⫹ ⫹ ⫹ ⫺ ⫺ ⫺
59 1.6 Almacenamiento de enteros
de la notación en complemento a dos. Podemos realizar la suma de cualquier combinación de números con signos iguales o distintos utilizando el mismo algoritmo y por tanto la misma circuitería. Esto contrasta de manera notable con la forma en que los seres humanos llevamos a cabo normalmente opera- ciones aritméticas. Mientras que a los niños se les enseña primero en la escuela elemental cómo sumar y solo después se les enseña a restar, una máquina que utilice notación en complemento a dos solo necesita saber cómo sumar.
Por ejemplo, el problema de realizar la resta 7 ⫺ 5 es el mismo que el pro- blema de realizar la suma 7 ⫹ (⫺5). En consecuencia, si una máquina tuviera que dar el resultado de restar 5 (almacenado como 0101) de 7 (almacenado como 0111), primero cambiará el 5 por ⫺5 (representado como 1011) y luego llevaría a cabo el proceso para sumar 0111 ⫹ 1011 obteniendo 0010, que repre- senta el valor decimal 2, de la manera siguiente:
7 0111 0111
⫺5 → ⫺ 0101 → ⫹ 1011
0010 → 2
Vemos que cuando se utiliza la notación de complemento a dos para represen- tar valores numéricos, basta con un circuito de suma combinado con un circuito que determine el valor negativo de un valor dado para así resolver problemas de suma y resta. (Tales circuitos se muestran y explican en el Apéndice B.)
El problema del desbordamiento Un problema que hemos evitado en los ejemplos
anteriores es que en todo sistema de complemento a dos existe un límite para el tamaño de los valores que se pueden representar. Si utilizamos comple- mento a dos con patrones de 4 bits, el entero positivo mayor que es posible representar es 7 y el entero negativo más grande es ⫺8. En particular, no pode- mos representar el valor 9, lo que significa que no podemos esperar obtener la respuesta correcta al problema de sumar 5 ⫹ 4. De hecho, el resultado que obtendríamos sería ⫺7. Este fenómeno se conoce con el nombre de desborda- miento. Es decir, el desbordamiento se produce cuando un cálculo genera un valor que cae fuera del rango de valores que puede ser representado. Cuando se usa la notación de complemento a dos, esto puede ocurrir tanto al sumar dos valores positivos como al sumar dos valores negativos. En cualquiera de los casos, la condición puede detectarse comprobando el bit de signo de la res- puesta. Se sabe que existe desbordamiento si la suma de dos valores positivos da como resultado un patrón que corresponde a un valor negativo o si la suma de dos valores negativos da como resultado un valor positivo.
Evidentemente, dado que la mayoría de las computadoras emplean siste- mas de complemento a dos con patrones de bits más largos que los que hemos usado en nuestros ejemplos, es posible manipular valores mucho más mayores sin que se produzca desbordamiento. Actualmente, es habitual emplear patro- nes de 32 bits para almacenar valores en notación de complemento a dos, que permiten acumular valores positivos tan grandes como 2.147.483.647 antes de que se produzca un desbordamiento. Si se necesitaran valores aun más gran- des, podrían emplearse patrones de bits más largos o quizá podrían modificarse las unidades de medida. Por ejemplo, determinar una solución en términos de millas en lugar de en términos de pulgadas genera números más pequeños e incluso proporcionaría la precisión requerida.
La cuestión es que las computadoras pueden cometer errores. Por tanto, la persona que utiliza la máquina tiene que ser consciente de los riesgos que esto implica. Un problema de los programadores y usuarios de computadoras es que se vuelven complacientes e ignoran el hecho de que valores pequeños pueden acumularse para generar números grandes. Por ejemplo, hace tiempo era nor- mal utilizar patrones de 16 bits para representar valores en notación de comple- mento a dos, lo que significaba que el desbordamiento se producía cuando se alcanzaban valores iguales o mayores que 215⫽ 32.768. El 19 de septiembre de 1989, un sistema informático hospitalario falló después de haber estado años proporcionando un servicio fiable. Una inspección en profundidad reveló que ese fecha era exactamente 32.768 días después del 1 de enero de 1900, y la máquina estaba programada para calcular las fechas basándose en esa fecha de inicio. Así, debido al desbordamiento, el 19 de septiembre de 1989 generó un valor negativo, un fenómeno para el que la programación de la computadora no estaba diseñada y no sabía cómo manejar.