Capítulo 2. La información y su representación. 1. Introducción 2. Representación numérica. 2.1. Sistemas de numeración. 2.1.1. Definición de sistema de numeración. 2.1.2. Sistema decimal. 2.1.3. Teorema fundamental de la numeración. 2.1.4. Sistema binario. Bit, byte y palabra. Suma binaria. 2.1.5. Sistema octal. 2.1.6. Sistema hexadecimal. 2.1.7. Conversiones entre sistemas. 2.2. Representación interna de números enteros. Coma fija. 2.2.1. Módulo y signo. 2.2.2. Complemento a 1. 2.2.3. Complemento a 2. 2.2.4. Exceso a 2n-1. 2.3. Representación interna de números reales. Coma flotante. 3. Representación alfanumérica. 3.1. Código ASCII. 3.2. Código EBCDIC. 1. Introducción. Cualquier información que se desee manejarse con la computadora debe estar en sistema binario, es decir debe representarse a base de ceros y unos, ya que los circuitos electrónicos que forman una computadora sólo reconocen dos estados, a uno le asignan un 0 y a otro un 1. Dentro del ordenador, en cualquier punto de un circuito se puede distinguir entre presencia de tensión o ausencia de tensión. Si se asigna el 1 a la presencia de tensión y el 0 a la ausencia se dice que se está utilizando lógica positiva. En caso contrario se trata de lógica negativa. 2. Representación numérica. 2.1. Sistemas de numeración. 2.1.1. Definición de sistema de numeración. Un sistema de numeración es un conjunto de símbolos y reglas para combinar dichos símbolos, que serán utilizados para representar datos numéricos, o sea cantidades. Se denomina base de un sistema de numeración al número de símbolos que emplea. Se suele utilizar la notación: Número en base B N(B Un sistema de numeración es posicional cuando el valor de cada dígito depende de la posición que ocupe respecto a la coma decimal. Ej. Un mismo dígito puede tener distintos valores: 51.3 El dígito 5 representa la cantidad 50 por su posición. 510.3 El dígito 5 representa la cantidad 500 por su posición. Un valor cualquiera se puede representar en un sistema posicional con base B de la forma siguiente: Dn...D1D0.D-1D-2...(B 2.1.2. Sistema decimal. El sistema decimal es el que utilizamos para contar desde hace muchos años. Es un sistema posicional y de base 10, ya que utiliza 10 símbolos que son: 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9. El rango de cantidades que se puede representar depende del número de dígitos utilizados, concretamente será BNºdígitos, es decir: - Con 1 dígito se pueden representar 10 cantidades (10 1 = 10), de la cantidad 0 a la cantidad 9. - Con 2 dígitos se pueden representar 100 cantidades (102 = 100), de la cantidad 00 a la 99. - Con 3 dígitos se pueden representar 1000 cantidades (10 3 = 1000), de la cantidad 000 a la 999. Y así sucesivamente. 2.1.3. Teorema fundamental de la numeración. Este teorema se utiliza para conocer qué cantidad en sistema decimal representa un número expresado en otro sistema de numeración posicional. La fórmula que debe aplicarse es: Número expresado en sistema con base B: Dn...D1D0.D-1D-2...(B Cantidad en decimal que representa ese número: Dn*Bn + ... + D1*B1 + D0*B0 + D-1*B-1 + D-2*B-2... Ej. El número 201.1(3 representa la cantidad 19.33: 201.1(3 = 2*32 + 0*31 + 1*30 + 1*3-1 = 19.33(10 2.1.4. Sistema binario. Bit, byte y palabra. Suma binaria. El sistema binario es el que emplean internamente los circuitos de la computadora. Este sistema tiene base 2, utilizando los símbolos 0 y 1. Cada dígito se llama bit (binary digit) y se definen los siguientes grupos de bits: - Byte: conjunto de 8 bits. Kilobyte (Kb): conjunto de 1024 bytes (1024 * 8 bits). Megabyte (Mb): conjunto de 1024 Kb (1024*1024*8 bits). Gigabyte (Gb): conjunto de 1024 Mb. Terabyte (Tb): conjunto de 1024 Gb. Se define palabra como el número de bits para el que ha sido diseñada una computadora, por ejemplo existen procesadores cuya palabra consta de 64 bits. En lugar de 1000 para la cantidad kilo se utiliza 1024 por motivos de diseño electrónico de los dispositivos, que almacenan la información en potencias de 2, siendo la potencia de 2 más cercana a 1000 la 1024 (210). En el sistema binario existen los siguientes rangos: - Con 1 dígito se pueden representar 2 cantidades (2 1 = 2), que son la cantidad 0 y la cantidad 1. - Con 2 dígitos se pueden representar 4 cantidades (22 = 4), que son: Binario 00 01 10 11 Decimal 0 1 2 3 - Con 3 dígitos se pueden representar 8 cantidades (23 = 8), que son: Binario 000 001 010 011 100 101 110 111 - Decimal 0 1 2 3 4 5 6 7 Con 4 dígitos se pueden representar 16 cantidades (24 = 16), que son: Binario 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Decimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 La suma binaria es análoga a la decimal, teniendo en cuenta la tabla siguiente: 0+0=0 0+1=1 1+0=1 1 + 1 = 0 (con acarreo de 1) Ej. 100101 + 10111 111100 2.1.5. Sistema octal. Este sistema es de base 8, utilizando los símbolos 0, 1, 2, 3, 4, 5, 6 y 7. Con un dígito se pueden representar 8 cantidades (de 0 a 7), con 2 dígitos 64 cantidades (de 00 a 77, que en decimal son de 0 a 63) y así sucesivamente. 2.1.6. Sistema hexadecimal. Este sistema es de base 16, utilizando los símbolos: 0 1 2 3 4 5 6 7 8 9 A B C D E F donde el valor de las letras es el siguiente: A B C D E F - 10 11 12 13 14 15 2.1.7. Conversiones entre sistemas. Para convertir un número de cualquier sistema al sistema decimal se utilizará el teorema fundamental de la numeración citado anteriormente. Ej. A4.2(16 a decimal: A4.2(16 = 10*161 + 4*160 + 2*16-1 = 164.125(10 Ej. 1101(2 a decimal: 1101(2 = 1*23 + 1*22 + 0*21 + 1*20 = 13(10 Para convertir un número decimal a binario se puede utilizar el método de las divisiones sucesivas hasta que el cociente sea 0, cogiendo los restos en orden inverso. Ej. 13(10 a binario: 13 / 2 = 6 / 2 = 3 / 2 = 1 / 2 = 0 (el cociente es 0) Restos: 1 0 1 1 Cogiendo los restos en orden inverso queda: 13(10 = 1101(2 Para pasar los decimales (dígitos a la derecha del punto decimal) del sistema decimal a binario se utiliza el método de los productos sucesivos por 2, cogiendo las partes enteras en orden directo. Se multiplicará por 2 sólo la parte decimal (quitando la parte entera) resultante del producto anterior. Se realizan productos hasta que la parte decimal resulte 0 o hasta que se obtenga la precisión deseada. Ej. 0.333(10 a binario: 0.333 * 2 = 0.666 (la parte entera es 0, la parte decimal es .666) 0.666 * 2 = 1.332 (la parte entera es 1, la parte decimal es .332) 0.332 * 2 = 0.664 (la parte entera es 0, la parte decimal es .664) 0.664 * 2 = 1.328 (la parte entera es 1, la parte decimal es .328) …………………. (se sigue multiplicando hasta que el error sea menor que el deseado) Por tanto: 0.333(10 = 0.0101...(2 Para pasar un número del sistema hexadecimal a binario, se escribe cada dígito con 4 bits, según la tabla siguiente: Hexadecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F Binario 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Ej. A3.C(16 a binario: A3.C(16 = 1010 0110.1100(2 Para pasar un número del sistema binario al hexadecimal, se cogen grupos de 4 bits, desde el punto decimal hacia los extremos, rellenando con ceros en los extremos si es necesario para completar los 4 bits del último grupo. A cada grupo se aplicará la correspondencia según la tabla anterior. Ej. 101010 0110.110011(2 a hexadecimal: 101010 0110.110011 Después de rellenar con ceros: 00101010 0110.11001100 Resultando: 2 A 6 . C C(16 Para pasar un número del sistema octal a binario, se escribe cada dígito con 3 bits, según la tabla siguiente: Octal 0 1 2 3 4 5 6 7 Binario 000 001 010 011 100 101 110 111 Ej. 72.5(8 a binario: 72.5(8 = 111 010.101(2 Para pasar un número del sistema binario a octal, se cogen grupos de 3 bits, desde el punto decimal hacia los extremos, rellenando con ceros en los extremos si es necesario para completar los 3 bits del último grupo. A cada grupo se aplicará la correspondencia según la tabla anterior. Ej. 10110110.10101(2 a octal: Después de rellenar con ceros: Resultando: 10110110.10101 010110110.101010 2 6 6 . 5 2(8 Para pasar un número del sistema decimal al sistema hexadecimal u octal, se realizará convirtiendo previamente al sistema binario como paso intermedio, para posteriormente pasar del binario al hexadecimal u octal según se ha explicado. 2.2. Representación interna de números enteros. Coma fija. Dentro de la computadora, los valores numéricos o cantidades se representan con bits, en sistema binario. En dicha representación debe concretarse el número de bits que se van a utilizar para codificar cada cantidad, además existen distintos tipos de representación, como vamos a ver en este apartado los tipos para números enteros (sin decimales). Se suelen llamar representación en coma fija, por suponerse la coma decimal en una posición fija, a la derecha el número representado. 2.2.1. Módulo y signo. El bit más a la izquierda representa el signo del número, donde 0 será positivo y 1 negativo. El resto de bits representa el módulo del número. Si se utilizan n bits para representar cada cantidad, el rango será el siguiente: Desde: Hasta: -2n-1 + 1 +2n-1 - 1 Ej. Con n=8 bits: Rango: de -127 a +127 La cantidad 10 se representa: 0 0001010 La cantidad -10 se representa: 1 0001010 Con este sistema existen 2 representaciones para la cantidad 0: 0 0000000 (+0) 1 0000000 (-0) 2.2.2. Complemento a 1. Este tipo de representación coincide con la anterior para valores positivos. Para representar valores negativos, se representará previamente el correspondiente valor positivo y a continuación se invierten todos los bits. Por lo tanto los números positivos tendrán el bit más a la izquierda a 0 y los negativos a 1. El rango coincide con el caso anterior, siendo con n bits de: Desde: Hasta: -2n-1 + 1 +2n-1 - 1 Ej. Con n=8 bits: Rango: de -127 a +127 La cantidad 10 se representa: 0 0001010 La cantidad -10 se representa: 1 1110101 Con este sistema existen también 2 representaciones para la cantidad 0: 0 0000000 (+0) 1 1111111 (-0) 2.2.3. Complemento a 2. Este tipo de representación coincide con las anteriores para valores positivos. Para representar valores negativos, se representará previamente el correspondiente valor positivo, a continuación se invierten todos los bits y finalmente se le suma 1 al bit más a la derecha. Por lo tanto los números positivos tendrán el bit más a la izquierda a 0 y los negativos a 1. El rango en este caso alcanza un número negativo más que en las representaciones anteriores, siendo con n bits de: Desde: Hasta: -2n-1 +2n-1 - 1 Ej. Con n=8 bits: Rango: de -128 a +127 La cantidad 10 se representa: 0 0001010 La cantidad -10 se representa: 1 1110101 + 1 1 1110110 Con este sistema existe sólo 1 representación para la cantidad 0: 0 0000000 (+0) 1 1111111 + 1 1 0 0000000 (-0) El acarreo (1) se desprecia. 2.2.4. Exceso a 2n-1. Este tipo de representación consiste en sumar el exceso (2 n-1) al número que se desea representar, pasándolo a continuación a binario con el número de bits que se vaya a utilizar. En este caso los números positivos tendrán el bit más a la izquierda a 1 y los negativos a 0, por tanto es al contrario que en los casos anteriores. El rango coincide con el visto en la representación en complemento a 2, alcanzando un número negativo más que positivo, siendo con n bits de: Desde: Hasta: -2n-1 +2n-1 - 1 Ej. Con n=8 bits, el exceso es de 27, o sea de 128, que es la cantidad que debe sumarse a cada número a representar: Rango: de -128 a +127 La cantidad 10 se representa: 10+128 = 138 = 1 0001010 La cantidad -10 se representa: -10+128 = 118 = 0 1110110 Con este sistema existe sólo 1 representación para la cantidad 0: 0 + 128 = 128 = 1 0000000 (+0) -0 + 128 = 128 = 1 0000000 (-0) 2.3. Representación interna de números reales. Coma flotante. Las representaciones anteriores, de coma fija, se utilizan para codificar valores enteros. Vamos a ver ahora la representación de valores con decimales, que se denomina en coma flotante. Para representar en coma flotante debe conocerse primero la notación científica normalizada, que consiste en representar una cantidad con la parte entera a 0, el primer dígito significativo distinto de cero debe ser justo el que está a la derecha del punto decimal y debe multiplicase por la potencia de 10 necesaria para que se corresponda con el valor original. Ej. 835.4 = 0.835 * 103 El 0.835 se llama mantisa. El 10 es la base. El 3 es el exponente. Para representar internamente en la computadora la base suele ser 2, por lo que la cantidad deberá expresarse en notación científica con base 2, en lugar de base 10. Este paso se realizará dividiendo el número entre 2 tantas veces como sea necesario hasta que la parte entera sea 0 y el primer dígito distinto de cero sea el que está a la derecha del punto decimal. El número de veces indicará el exponente de la base 2. En caso de que el valor original no tenga parte entera, sino sólo decimales, en lugar de dividir por 2 se debe multiplicar por 2 tantas veces como sea necesario hasta conseguir lo mismo que en el caso anterior, siendo ahora el exponente de 2 negativo. Ej. 12 en notación científica normalizada con base 2: 12 / 2 = 6 / 2 = 3 / 2 = 1.5 / 2 = 0.75 (se ha dividido 4 veces) 12 = 0.75 * 24 Mantisa=0.75 Base=2 Exponente=4 Ej. 0.0273 en notación científica normalizada con base 2: 0.0273 * 2 = 0.0546 * 2 = 0.1092 (se ha multiplicado 2 veces) 0.0273 = 0.1092 * 2-2 Mantisa=0.1092 Base=2 Exponente=-2 Al pasar la mantisa de decimal a binario, podría quedar el primer bit a la derecha del punto decimal a 0, con lo que ya no sería notación científica normalizada. Para corregirlo, simplemente se desplazan todos los bits a la izquierda y se resta 1 al exponente. Ej. Al pasar a binario puede quedar: 0.0101*2 3, que debe pasarse a notación científica normalizada: 0.0101*23 = 0.101*22 Para representar cada parte del número se utilizan las representaciones de coma fija ya comentadas. Para la mantisa se suele utilizar una de las 3 siguientes: módulo y signo; complemento a 1; o complemento a 2. Para el exponente se suele utilizar una de las dos siguientes: módulo y signo; o exceso a 2n-1. La base no se representa, ya que el procesador se diseña para una base determinada (que suele ser 2), por lo que se da por conocida. En coma flotante se suelen usar dos tipos de representaciones: - Simple precisión, utiliza 32 bits repartidos de la siguiente manera: SM Exponente bit 31 30 23 22 Mantisa 0 Donde la mantisa ocupa 24 bits, del 0 al 22 y el bit 31 que guarda el signo de la mantisa. El exponente ocupa 8 bits, del 23 al 30. - Doble precisión, utiliza 64 bits repartidos de la siguiente manera: SM Exponente bit 63 62 52 51 Mantisa 0 Donde la mantisa ocupa 53 bits, del 0 al 51 y el bit 63 que guarda el signo de la mantisa. El exponente ocupa 11 bits, del 52 al 62. Ej. En simple precisión, con mantisa en complemento a 1 y exponente en exceso a 2n-1, como n es 8 será exceso a 128. 12(10 = 0.75 * 24 Mantisa=+0.75 Exponente=4 Mantisa: +0.75 a binario: +0.11 Signo mantisa: positivo, o sea 0. Como mantisa es positiva, en complemento a 1 no se invierten los bits. Exponente: 4 + 128 = 132 = 10000100 bit 0 10000100 1100000000…0000 31 30 23 22 0 -12(10 = -0.75 * 24 Mantisa=-0.75 Exponente=4 Mantisa: -0.75 a binario: -0.11 Signo mantisa: negativo, o sea 1. Como mantisa es negativa, en complemento a 1 se invierten los bits. Exponente: 4 + 128 = 132 = 10000100 bit 1 10000100 001111111…1111 31 30 23 22 0 En coma flotante, el rango depende principalmente del número de bits usados para el exponente. Además la precisión estará limitada a un determinado número de decimales, en función del número de bits utilizados para la mantisa. 3. Representación alfanumérica. Se llama información alfanumérica a aquella que no representa cantidades o valores numéricos, por ejemplo un nombre, una dirección, etc., que pueden estar formados por las letras mayúsculas, las minúsculas, las 9 cifras, los sígnos de puntuación, etc. Para representar información alfanumérica se han creado códigos, que asignan a cada carácter alfanumérico una combinación distinta de ceros y unos. 3.1. Código ASCII. Este es el código alfanumérico más utilizado. Inicialmente se creó con 7 bits, pero después se expandió hasta los 8 bits, llamándose ASCII extendido. Puede representar 256 caracteres distintos (28=256). Las correspondencias son las siguientes: 3.2. Código EBCDIC. Otro código alfanumérico utilizado es el EBCDIC. Este también emplea 8 bits para codificar cada carácter, por lo que puede representar hasta 256 caracteres distintos.