Sistemas de numeración Un bit es la cantidad mínima de información que puede manejar una máquina digital (PC, smartphone, etc). En un bit se puede guardar muy poca información, únicamente un 0 (que representa el estado "apagado", -"no hay corriente"-) o un 1 (que representa el estado "encendido", -"sí hay corriente"-). Por eso, los bits se agrupan para obtener conjuntos mayores con más capacidad. En concreto, a cada conjunto de 8 bits se le da el nombre de byte. De todas maneras, el byte también se queda corto y se suelen utilizar otros múltiplos. Así, un 1 kilobyte -o KB- son 1024 bytes, 1 megabyte -o MB- son 1024 KB (1048576 bytes), 1 gigabyte -o GB- son 1024 MB (1073741824 bytes), 1 terabyte -o TB- son 1024 GB (1099511627776 bytes) y 1 petabyte -o PBson 1024 TB (1125899906842624 bytes). A continuación mostramos la escalera de conversión de unidades donde se ve más claramente lo recién explicado: %8 ----> bit % 1024 ---------> byte x8 <---- % 1024 ---------> KB x 1024 <--------- %1024 ---------> MB x 1024 <--------- x 1024 <--------- %1024 ---------> GB %1024 --------> TB x 1024 <--------- PB x 1024 <-------- Así, por ejemplo, un ordenador con 640 kilobytes de memoria RAM es un ordenador con 640 conjuntos de 1024 bytes (o lo que es lo mismo, 640x1024x8 bits), mientras que un lápiz USB con 2 Gigabytes de capacidad puede almacenar 2x1024x1024x1024 bytes(o lo que es lo mismo, 2x1024x1024x1024 x8 bits). NOTA: Puede ocurrir que los prefijos mega,giga etc alguna vez se interpreten como multiplicadores decimales y no binarios (1000 en vez de 1024), por lo que hay que estar seguro de cómo se interpretan estos prefijos en un caso concreto. Y otra precaución: cuando se habla en términos de múltiplos de bits o de bytes, hay que vigilar; si se dice que una memoria tiene 100 KB estamos diciendo que tiene 100 Kilobytes (es decir, 800 Kilobits): la B mayúscula indica “bytes”. En cambio, si decimos que una memoria tiene 100Kb estamos diciendo que tiene 100 Kilobits: la b minúscula indica “bits”. Como se puede ver, la diferencia es importante y hay que tenerla en cuenta porque, entre otras cosas, mucha propaganda de ISPs muestran las velocidades ofrecidas en múltiplos de bits por segundo (es decir, en Kbps, Mbps o Gbps) en vez de bytes por segundo (que sería lo más "natural") por lo que, si no nos fijamos, podemos malinterpretar que su ancho de banda es 8 veces mayor de lo que realmente es. Debido, pues, a que la representación de la información que una máquina digital es capaz de reconocer es solamente la combinación de 0 y 1 –representación binaria- , y no la representación tradicional humana –representación decimal-,deberemos conocer algunas características de esta nueva manera de notación numérica, que ahora pasaremos a explicar. Pasar de representación binaria a representación decimal Un número representado en binario será una serie de dígitos, que deberán ser el 0 o el 1, por ejemplo el 110010. Para convertir la representación binaria de este número en representación decimal, asociaremos las potencias de dos (1, 2, 4, 8, 16, 32, 64, 128, 256, etc) consecutivamente a cada uno de los bits que forman el número (comenzando por la derecha) y sumaremos sólo las potencias que resulten asociadas a bits con valor 1. Es decir: 110010= 1*32 +1*16 +0*8 +0*4 +1*2 +0*1=1*32+1*16+1*2=50 Otro ejemplo: 111000011=1*256+1*128 +1*64 +1*2 +1*1 = 256+128+64+2+1=451 Pasar de representación decimal a representación binaria Lo primero que haremos será dividir el número decimal original por 2, obteniendo sólo un resultado determinado (entero) y un resto (el cual siempre será 0 o 1). Seguiramente repetiremos la división, obteniendo otra vez el resultado entero y el resto. Deberemos ir repitiendo el proceso hasta que el cociente sea 1. Una vez llegados a este punto, los dígitios binarios deseados serán este último cociente y todos los restos de las divisiones realizadas, siendo el bit de "más a la izquierda" ese último cociente y colocándose a su derecha el resto más cercano, seguido del resto anterior, y del resto anterior, y así hasta llegar al primer resto obtenido de todos, que será el bit "más a la derecha". Por ejemplo, queremos pasar el número 50 decimal. 50÷2 0 25÷2 1 12÷2 0 6÷2 0 3÷2 1 1 110010 Si, como ocurre en el ejemplo anterior, el resultado tuviera un número de bits menor a ocho (lo que forma un byte) y necesitáramos completar el byte, basta con rellenar con ceros a la izquierda los huecos que falten. Es decir, el resultado anterior es equivalente a 00110010. Otro ejemplo: para pasar el 451 (decimal) a notación binaria haremos: 451÷2 1 225÷2 1 112÷2 0 56÷2 0 28÷2 0 14÷2 0 7÷2 1 3÷2 1 1 111000011 (o, en 2 bytes: 00000001 11000011) El sistema hexadecimal Ya que, por la naturaleza de los ordenadores digitales, los números se representan internamente en sistema binario, muchas veces es útil representar algunos números en binario en lugar de en decimal. Pero el sistema binario, aunque sea el más cómodo para las máquinas, suele ser muy engorroso para los humanos. En cuanto el número alcanza los cuatro o cinco dígitos binarios, se hace difícil de recordar y resulta muy sencillo equivocarse al escribirlo. Para evitar esta incomodidad se usa el sistema de notación hexadecimal. Este sistema, en realidad, no es más que un "maquillaje" del sistema binario que permite a los humanos trabajar más cómodamente, pero ha de quedar claro que usar el sistema hexadecimal es completamente equivalente a usar el sistema binario (pero de una forma algo más sencilla). Cada dígito hexadecimal es equivalente a una combinación concreta de cuatro bits. Si contáramos las combinaciones posibles de 0 y 1 que se pueden hacer con cuatro posiciones, es fácil ver que salen 16 (de hecho, hay una fórmula para obtener ese resultado directamente sin tener que contar "a mano": nºvaloresnºposiciones; por tanto, si nºvalores es 2 (0 y 1) y nºposiciones es 4, sale 24=16). Por tanto, deberá haber 16 dígitos hexadecimales, uno por cada combinación (de ahí, precisamente, el nombre de "hexadecimal").A continuación se presenta la tabla de equivalencias entre las diferentes combinaciones de grupos de cuatro bits y el dígito hexadecimal correspondiente (tal como se puede ver, en lugar de inventar nuevos símbolos para los dígitos del 10 al 15, se usan letras de la A a la F): Binario 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Hexadecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F De esta forma, resulta muy cómodo pasar números de binario a hexadecimal y a la inversa. Lo único a tener en cuenta al pasar de un sistema a otro es que a cada cuatro bits se le corresponde un dígito hexadecimal y viceversa. Es decir, el sistema hexadecimal simplemente es una manera de escribir información binaria de forma mucho más compacta. Veamos un ejemplo. Hemos visto que el número 50 en binario es 110010. Pasaremos este número binario a hexadecimal Para ello agruparemos el 110010 en conjuntos de 4 bits comenzando por la derecha. Si no tuviéramos grupos de cuatro exactos porque algún dígito de más a la izquierda quedara suelto, rellenaremos con ceros por la izquierda hasta obtenerlos. Si hacemos esto, obtenemos los grupos 0011 y 0010. Miramos en la tabla y a estos grupos les corresponde los dígitos hexadecimales 3 y 2, respectivamente. Así, la representación hexadecimal de este byte es 32. NOTA: Para distinguir en cada momento qué sistema de notación estamos utilizando (la representación 32 podría ser tanto hexadecimal como decimal y puede prestar a confusión) se sigue el convenio siguiente. Los números hexadecimales se representan acabando siempre con una “h”. Es decir que 32h es un número hexadecimal (el 50 decimal) y el 32 a secas es el 32 decimal. Y lo mismo pasa con los números binarios: el número 101 puede representar tanto el 101 decimal como el 5 decimal. Por ello, los números binarios acaban con una “b”, de manera que 101b es, efectivamente, el 5 decimal. Veamos ahora el ejemplo contrario: pasar de hexadecimal a binario. Supongamos que queremos obtener la representación binaria del número 5FA0h. Para ello cogemos de la tabla anterior los grupos correspondientes a cada dígito hexadecimal en el mismo orden y queda: 01011111-1010-0000 (es decir, dos bytes: 01011111 10100000). Se puede apreciar aquí que es mucho más fácil recordar una cantidad escrita en hexadecimal que en binario. También es fácil ver que un byte siempre se representa por una pareja de símbolos hexadecimales, así que dos bytes se representarán por dos parejas, y así. Pasar de hexadecimal a decimal es un poco más engorroso. O bien pasamos de hexadecimal a binario y luego de binario a decimal tal como hemos aprendido, o bien, si lo queremos hacer directamente tendríamos que utilizar la fórmula 32h= 3*16 1 + 2*160 =48+2=50 . El paso de decimal a hexadecimal también se podría hacer pasando primero por el binario o, si se desea hacer directamente, mediante el método de las divisiones sucesivas, así: 24480÷16 0 1530 ÷ 16 10 95÷16 15 5 5FA0 Representación interna de caracteres.Estándares ASCII y Unicode Hasta ahora hemos visto cómo los ordenadores trabajan con números utilizando la notación binaria para representarlos (aunque, de hecho, solo hemos estudiado los números enteros: faltarían los números negativos, los números decimales...pero lo dejaremos aquí por ahora). No obstante, ¿cómo trabajan con caracteres (es decir, letras minúsculas y mayúsculas, signos de puntuación, etc)?. La respuesta es que existe un determinado número de caracteres predefinidos de fábrica en el hardware de toda máquina moderna que ya están listos para poder ser utilizados por cualquier sistema o programa. Todos estos caracteres se representan con una combinación de 7 bits estandarizada por la organización ANSI (American Nacional Standards Institute) en un documento llamado llamado ASCII (American Standard Code for Interchange –Código estándar para el intercambio de información). Este documento en realidad es una tabla de correspondencia (grabada en algún chip de cualquier máquina) que asocia una determinada combinación de 7 bits a un determinado caracter. Esta tabla se muestra aquí: http://www.asciitable.com NOTA: Las 32 primeras combinaciones del código ASCII, utilizadas originalmente para funciones de control de dispositivos se denominan “códigos de control” y son códigos no imprimibles, la mayoría ya en desuso. Ya hemos dicho que esta tabla está grabada en el hardware de cualquier PC estándar. No obstante, cuando se trabaja con datos, es más rápido y más eficaz para la CPU utilizar 8 bits –un byte- en lugar de utilizar 7 bits. Como resultado, cuando se almacena un dato utilizando la codificación ASCII, ocupa ocho bits, igual que cualquier otro dato, pero con la particularidad que en el código ASCII el bit octavo es “off”. Algunos fabricantes de hardware han aprovechado la existencia de otras 128 combinaciones con el octavo bit “on” y han creado lo que se conoce generalmente como conjunto de caracteres en “código ASCII extendido”, que incluye símbolos internacionales de monedas, caracteres para dibujar líneas, alfabetos distintos del inglés y otros caracteres que pueden imprimirse. Hay que tener en cuenta que estos caracteres no son estrictamente ASCII y pueden variar según el creador. Pronto se vio la necesidad de adoptar un estándar de representación de caracteres que fuera más amplio que el ASCII extendido. Con éste sólo se tenían 2 8 caracteres diferentes posibles (recordemos la fórmula de contar combinaciones), por lo que quedaba excluida totalmente la representación de caracteres chinos, árabes o hebreos. Surgió entonces el estándar Unicode realizado por un consorcio de empresas. Dentro de este estándar, hay diferentes formatos de representación: el más habitual es el denominado UTF-16, en el cual se utilizan 2 bytes para la representación de los caracteres. De esta manera se tienen 216 combinaciones posibles, suficientes para todos los alfabetos del mundo. El estándar Unicode es compatible con el ASCII; es decir, los 256 primeros caracteres de Unicode coinciden con los del ASCII extendido más popular, de manera que hay problemas de conversión con aplicaciones más antiguas. No obstante, la gestión y reconocimiento del estándar Unicode reside en el sistema operativo y las aplicaciones software que funcionan sobre él, de manera que si no tenemos estos elementos –actualmente, todos los SS.OO reconocen este estándar- , el único estándar que el ordenador entenderá es el ASCII, que está implementado a nivel de hardware.