10 febrero, 2009

CSI XV: Los números de los computadores

Con la crisis, amigos míos, todos echamos números. Los hay que no, pero es lo que tiene vivir con dinero de los demás: atrofia el ingenio para buscarse alternativas, libres y gratuitas. Echar números es sólo necesario si vas algo apurado, como el 90% de población española.

Para echar números se inventaron las calculadoras, hace ya muchos años. Y de de la evolución las calculadoras nació el microprocesador, hace ya 38 años. Tiene huevos, por otro lado, que como respuesta a la crisis la vicepresidenta diga que nos vamos a montar en el chip para abandonar el crecimiento basado en el ladrillo. Porque para eso han tenido tiempo, y de sobra, dos administraciones socialistas, otras dos peperas, unas tres y media socialistas de nuevo y un trozo de la de la UCD. A buenas horas, (vice)presidenta.

Retomemos que me enciendo. Lo que les voy a contar hoy en Cosas que Sí se dan en Informática es cómo cuentan los computadores. O, dicho de otro modo, cómo representan los números los ordenadores.


A estas horas es vox populi (excepto quizá para nuestros representantes públicos) que los computadores utilizan ceros y unos para representar la información. Antiguamente eran campos magnéticos en núcleos de ferrita, hoy pueden ser en forma de surcos en discos ópticos y mañana quizá sea en cuantos de energía en átomos. Dejando la lógica difusa al margen la cosa sigue teniendo la misma base: haber o no haber. 1 o 0. Y ahora veamos qué es eso del binario.

Utilizar dos caracteres para representar números tiene la misma dificultad que emplear 10. Que es lo que hacemos los humanos continuamente. El llamado sistema decimal no es más que un sistema posicional de representación con diez símbolos (0, 1, 2, 3, ..., 9). Es posicional porque la posición importa en el valor de un símbolo, como sabrán todos aquellos que han sido llamados "ceros a la izquierda". Así, el número 459 significa, exactamente:

4*102 + 5*101 + 9(*100)

El carácter más significativo -el 4- lo colocamos más a la izquierda y se multiplica por la base -10- elevado a su posición -la tercera-. Análogamente para el resto.

Con el binario, la representación es idéntica. Sólo tenemos que tomar la base 2.

1*28 + 1*27 + 1*26 + 0*25 + 0*24 + 1*23 + 0*22 + 1*21 + 1*20

Nos da exactamente 459, si le apetece hacer la suma. O nos da exactamente 111001011. Utilizar un sistema decimal en lugar de cualquier otro es completamente arbitrario o fortuito. De hecho, no está del todo claro por qué gastamos un sistema decimal, aunque muy posiblemente sea por tener diez dedos. Desde luego, es un argumento de peso.

Como escribir 111001011 es un rollo, incluso para una cantidad pequeña como 459, los informáticos nos apañamos para representar grandes números empleando otras bases más cómodas, como la octal o hexadecimal. En la primera empleamos los símbolos 0, 1, 2, 3, 4, 5, 6 y 7. En la segunda, todos los anteriores y además 8, 9, A, B, C, D, E y F. Es inmediato pasar de binario a ocal y hexadecimal (y a la inversa). Tan sólo tenemos que agrupar los símbolos binarios de 3 en tres y representar el correspondiente caracter octal, o de cuatro en cuatro y sustituir por el correspondiente símbolo hexadecimal:

111 001 011 = 713 (7*82 + 1*81 + 3*80)
1 1100 1011 = 1CB (1*162 + 12*161 + 11*160)


¡Maravilloso!. Ya tenemos hasta cuatro maneras de representar lo mismo. Cualquier número que se nos ocurra puede ser representado de cualquiera de ellas, aunque no dentro de un computador. porque la aritmética de un computador es finita, lo que no es sino un modo de decir que tiene límites: números mayores de cierto rango (o menores) no nos cabrán. Pero no nos preocuparemos por ellos todavía.

¿Y nos sirve de algo lo visto en tiempos de crisis?. Pues no, porque aún no podemos representar la realidad, mucho más dramática que lo visto hasta ahora. La cruda realidad cuenta con números rojos.

Los números rojos son negativos y usted lo tiene muy fácil para representarlos porque hace trampa: pone un - delante de ellos y ya. ¡Es hacer trampa porque añade un símbolo que no estaba en el conjunto inicial de diez!. ¿Cómo se las apañaría para representar números negativos sin ningún símbolo añadido?. A esa pregunta respondieron los informáticos hace mucho tiempo.

La solución fácil: reservamos una posición, la más significativa, para indicar si un número es positivo o negativo. El resto del número nos da su magnitud. A ésta forma de representación se le llama signo y magnitud, por razones que explicaré otro día. Si el primer símbolo es un cero, el número es positivo. Si es un 1, negativo.

0 000 -> +0   |   1 000 -> -0
0 001 -> +1   |   1 001 -> -1
0 010 -> +2   |   1 010 -> -2
...

Ésta forma de representación, además de contar con la curiosidad de disponer de dos ceros, es un peñazo, porque requiere analizar el signo antes de ponerse a operar con los números y hacer sumas y restas y aritmética en general. Hay métodos más cómodos.

La forma que efectivamente se gasta un montón es el llamado Complemento a 2. El Ca2 representa los números positivos como los naturales que vimos al principio. Los negativos, en cambio, los representa invirtiendo todos lo bits y sumando uno al resultado (lo que se llama hacer el complemento a dos1). Sumar, por cierto, es tan fácil como en base decimal: cero mas cero es cero; cero mas uno, uno; y uno más uno, cero y me llevo uno.
Veamos un ejemplo de representación en Ca2:

0000 -> +0   |   1111 -> -1 ( invertimos1(0001) = 1110 + 1 = 1111 )
0001 -> +1   |   1110 -> -2 ( invertimos2(0010) = 1101 + 1 = 1110 )
0010 -> +2   |   1101 -> -3 ( invertimos3(0011) = 1100 + 1 = 1101 )

¿Por qué es tan interesante esto que a primera vista parece un lío?. Bueno, podemos ver a la primera si un número es positivo o negativo. Y ya no tenemos dos ceros. Y sobretodo nos permite sumar a la primera cantidades negativas y positivas. Un ejemplo:

-20 + 10 = -10

-20 -> invertimos20(010100) = 101011 + 1 = 101100
+10 ->                                     001010
                                           110110 -> Ca2(110110) = 001001 + 1 => 001010 = 8 + 2 = 10

La suma nos ha dado -10 directamente, sin tener que hacer ajustes posteriores. Y no los habrá que hacer, a menos que que el resultado no sea representable (no nos quepa) en la longitud de bits máxima que tenemos. Así que nosotros nos quedaremos con éste formato para representar los enteros.

De todos modos, este formato tampoco representa la realidad. Porque si usted va al banco, transfiere unos 120 euros y le cobran un 4% de comisión (5 euros) se quedará de piedra. Primero: porque hay que ser joputas para cobrar un 4% de comisión por una mierda de operación bancaria que se realiza a través de Internet. Y segundo, porque el 4% de 120 no son 5 euros, sino 4.80. ¿Quién se ha quedado sus 20 céntimos en tiempos de crisis?

El banco, evidentemente. Porque sus ordenadores no pueden representar cantidades decimales, no al menos hasta que yo les explique cómo. Y redondean (que no truncan) para fastidiarle a usted. Pero les contaré cómo representar cantidades fraccionales sin hacer de nuevo trampa e introducir más símbolos como el '.'.

¡Eso será más adelante, en Cosas que Sí de dan en Informática!

1 ver la referencia para una explicación más convincente.

Apuntes de clase. ¡Esto se estudia en primero!
Sistema binario. Wikipedia.
Complemento a dos. Wikipedia.

Posts relacionados

2 cosillas:

pinar dijo...

La coma flotante, la coma flotante !!!

Eso sí que es interesante !!

Delirium dijo...

Pues sí, y a eso iré más adelante, claro que sí. Por cierto, que los apuntes son de mi hermano. tendré que esperar que me lo explique él...