Download TEMA 2
Document related concepts
Transcript
Capítulo 2: Representación de la información en las computadoras. Página 1. OBJETIVOS. En este tema se verán los aspectos relacionados con la representación de la información en el interior de las computadora, tanto la representación de información numérica como no numérica. También se analizan los aspectos prácticos de los sistemas de numeración matemáticos desde el punto de vista de su aplicación en Informática, ya que gran cantidad de las transformaciones de información que tienen lugar en la computadora se fundamentan en los sistemas de numeración. Posteriormente se presentan los códigos de entrada/salida, con los que se traduce la información externa a la computadora en forma comprensible por los elementos internos del mismo. También se hacen unas consideraciones generales sobre los problemas que presentan los errores producidos en la transmisión o almacenamiento de información, así como las técnicas más básicas para la detección automática de estos errores. Por último se consideran las transformaciones internas que tienen lugar en la computadora con los datos en código de E/S para su adecuación en la realización de operaciones aritméticas. 1.- INTRODUCCION. Una computadora es una máquina que procesa información. Más concretamente, la ejecución de un programa implica la realización de unos tratamientos con unos datos, según indica un conjunto ordenado de instrucciones, programa. Lógicamente, para que la computadora ejecute un programa es necesario darle dos tipos de informaciones: las instrucciones que forman el programa y los datos con los que debe operar ese programa. Dos de los aspectos más importantes que se presentan en Informática relacionados con la información son cómo «representarla» y cómo «registrarla» físicamente. Ambos problemas están íntimamente relacionados y el primero de ellos es el objetivo fundamental de este capítulo. El segundo objetivo se resuelve con «soportes de información» (discos y cintas magnéticas, etc. ) que se estudiarán en el Capítulo 4. Normalmente la información se da a la computadora en la forma usual escrita que utilizan los seres humanos; es decir, con ayuda de un alfabeto o conjunto de símbolos, que denominaremos caracteres. Los caracteres que constituyen el alfabeto suelen agruparse en cinco categorías: Caracteres alfabéticos: son las letras mayúsculas y minúsculas del abecedario inglés: A, B, C, D, E, ..., X, Y, Z, a, b, c, d, ..., x, y, z Caracteres numéricos: están constituidos por las diez cifras decimales: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 El cero suele marcarse con una raya inclinada (0) para evitar posibles confusiones con la “o” mayúscula (O). Caracteres especiales. son los símbolos no incluidos en los grupos anteriores, entre otros están los siguientes. ) ( , ./ ; : + Ñ ñ = ! ? "& > # < ] [ SP donde SP se representa el espacio en blanco, tal como el que separa dos palabras. Caracteres de control: representan órdenes de control, como el carácter indicador de fin de línea o el carácter indicador de sincronización de una transmisión o de que se emita un pitido en un terminal, etc. Muchos de los caracteres de control son generados e insertados por el propio computadora. Caracteres gráficos: son símbolos o módulos con los que se pueden representar figuras (o iconos) elementales. Capítulo 2: Representación de la información en las computadoras. Página 2. En este tema nos restringiremos principalmente a los tres primeros tipos de caracteres, a veces denominados caracteres-texto. A la agrupación de los dos primeros tipos se le denomina conjunto de caracteres alfanuméricos. De la misma forma que una máquina de escribir no suele tener teclas para todos los caracteres posibles, un sistema de procesamiento de la información (periférico o procesador) puede no reconocer algunos caracteres (la ñ, por ejemplo). Toda comunicación con una computadora convencional se realiza según los caracteres que admitan sus dispositivos de E/S, y con ellos los usuarios tienen que expresar cualquier dato o instrucción. Es decir, toda instrucción o dato se representará por un conjunto de caracteres tomados del alfabeto definido en el sistema a utilizar. A continuación vamos a ver cómo se pueden representar los caracteres en las computadoras. El diseño de un sistema informático resulta más fácil, su realización menos compleja y su funcionamiento muy fiable, si se utilizan sólo dos valores o estados posibles para las variables físicas que representan los caracteres en los soportes de información o en el interior de la computadora. Como ya se indicó, estos valores conceptualmente se representan por cero (0) y uno (1), y corresponden a dos niveles de tensión (0 voltios y 3.5 voltios, por ejemplo), dos valores de corriente, dos situaciones de una lámpara (apagada y encendida), etc. En otras palabras, la información es retenida por medio de dos valores de una magnitud física (bit) que podemos representar conceptualmente por ceros y unos. Al tener que “traducir” toda la información suministrada a la computadora a ceros y unos, es necesario establecer una correspondencia entre el conjunto de todos los caracteres = {A, B, C, D,..., Z, a, b,..., z, 0,1, 2, 3,..., 9, /, +, (, ),...) y el conjunto binario = {0,1}n es decir, es necesario hacer una codificación o representación de los elementos de un conjunto (en este caso ) mediante los de otro conjunto () de forma tal que a cada elemento de le corresponda un elemento distinto de (n bits). Estos códigos de transformación se denominan códigos de entrada/salida (E/S) o códigos externos y pueden definirse de forma arbitraria. No obstante existen códigos de E/S normalizados que son utilizados por diferentes constructores de computadoras; estos códigos los estudiaremos más adelante. Las operaciones aritméticas con datos numéricos se suelen realizar en una representación más adecuada para este objetivo que la obtenida con el código de E/S. Por ello en la propia computadora se efectúa una transformación entre códigos binarios, obteniéndose una representación fundamentada en el sistema de numeración en base 2, sistema que puede considerarse como una codificación en binario más, pero que al ser una representación numérica posicional es muy apta para realizar operaciones aritméticas. 2.- SISTEMAS DE NUMERACIÓN USUALES EN INFORMÁTICA. Las computadoras suelen efectuar las operaciones aritméticas utilizando una representación para los datos numéricos basada en el sistema de numeración base dos o sistema binario (que llamaremos binario natural para no confundir con los códigos binario de E/S). También se utilizan los sistemas de numeración, preferentemente el octal y hexadecimal, para obtener códigos intermedios. Un número expresado en uno de estos dos códigos puede transformarse directa y fácilmente a binario y viceversa. Con ellos se simplifica la transcripción de números binarios y se está más próximo al sistema usado normalmente (sistema decimal), por lo que a veces se utilizan como paso intermedio en las transformaciones de decimal a binario y viceversa. Además, la realización electrónica de Capítulo 2: Representación de la información en las computadoras. Página 3. codificadores/decodificadores entre binario y un código intermedio es mucho menos compleja que entre binario y decimal. 2.1. Representación posicional de los números. Un sistema de numeración en base b utiliza para representar los números un alfabeto compuesto por b símbolos o cifras. Así, todo número se expresa por un conjunto de cifras, contribuyendo cada una de ellas con un valor que depende a) de la cifra en sí, y b) de la posición que ocupe dentro del número. En el sistema de numeración decimal, o sistema en base 10, que es el que más se usa, b = 10 y el alfabeto está constituido por diez símbolos, llamados también cifras decimales: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} y, por ejemplo, el número 5.367,24 se puede obtener como suma de: 5 000 + 300 + 60 + 7 + 0,2 + 0,04 = 5.367,24 es decir, se verifica que: 5.367,24 = 5 x 103 + 3 x 102 + 6 x 101 + 7 x 100 + 2 x 10-1 + 4 x 10-2 Se puede observar que cada posición (unidades, decenas, centenas, millares, etc.) tiene un peso especifico, así: posición 0 unidades peso b0 posición 2 centenas peso b2 posición 1 decenas posición 3 millares peso b1 peso b3 .................. En general que la representación de un número en una base b: N …n4, n3, n2, n1, n0, n-1, n-2, n-3, … (1) tiene una forma abreviada de expresar su valor es la siguiente: N …n4 x b4 + n3x b3 + n2x b2 + n1x b1 + n0x b0 + n-1x b-1 + n-2x b-2 + n-3x b-3 + … (2) Para representar un número resulta más cómodo que los símbolos del alfabeto o la base de numeración sean las menos posibles, pero también es cierto que cuanto menor es la base, mayor es el número de cifras que se necesitan para representar una cantidad dada. Por ejemplo, el valor en binario del número decimal 175 es 1111011. 2.2. Sistema de numeración en base dos. Como ya se dijo las operaciones aritméticas en una computadora se suelen realizar usando una representación para datos y resultados en sistema binario natural. A pesar de que el cambio del código binario de E/S a la representación en binario natural se realiza de forma automática por la computadora, es conveniente recordar una serie de cuestiones relativas al sistema binario y a las transformaciones entre éste y el sistema decimal. 2.2.1. Definición del sistema binario. En el sistema de numeración binario b es igual a 2 y sólo se precisan dos elementos, el conjunto {0, 1}, para representar cualquier número. Los elementos de este alfabeto se conocen como cifras binarias o bits. En la Tabla 1 se muestran los números enteros binarios que se pueden formar con tres dígitos o bits, que se corresponden con los números decimales del 0 al 7. Decimal 0 1 2 3 4 5 6 7 Binario 000 001 010 011 100 101 110 111 Tabla 1. Números binarios del 1 al 7. Capítulo 2: Representación de la información en las computadoras. Página 4. 2.2.1. Pasar un número de sistema binario a decimal. Para transformar un número en sistema binario a decimal sólo hay que tener en cuenta las expresiones (1) y (2) en las que b sea igual a 2. Ejemplo 1. Transformar a decimal los siguientes números binarios: 110010; 1,1101; 10111,011; 110010)2 = (1 x 25) + (1 x 24) + (1 x 21) = 25 + 24 + 21 = 32 + 16 + 2 = 50)10 1,1101)2 = 20 + 2-1 + 2-2 + 2-4 = 1 + 1/2 + 1/4 + 1/16 = 1,875)10 10111,011)2 = 24 + 22 + 21 + 20 + 2-2 + 2-3 = 16 + 4 + 2 + 1 + 1/4 + 1/8 = 23,375)10 Como se puede ver en el ejemplo anterior, para transformar un número de binario a decimal basta con ir sumando los pesos en las posiciones en que haya un 1, como se comprueba en el siguiente ejemplo. Ejemplo 2. 1 0 1 0 , 0 1 )2 = 8 + 2 + ¼ = 10,25)10 8 4 2 1 , ½ ¼ 1 0 1 1 0 1 0 )2 = 64 + 16 + 8 + 2 = 80)10 64 32 16 8 4 2 1 2.2.2.Pasar un número de sistema decimal a binario. Para transformar un número en sistema decimal a binario se sigue los dos pasos siguientes: a) La parte entera del nuevo número en binario se obtiene dividiendo por 2, sin obtener decimales en el cociente, la parte entera del número decimal que se quiere convertir a binario, y los cocientes sucesivos que se vayan obteniendo. Los restos de estas divisiones y el último cociente, que será siempre 0 o 1, son las cifras binarias. El último cociente será el bit más significativo y el primer resto será el bit menos significativo. Ejemplo 3. 56)10 en binario es: 56)10 = 111000)2, ya que: 56 2 0 28 2 0 14 2 0 7 2 3 2 1 1 b) La parte fraccionaria del nuevo número en binario se obtiene multiplicando por 2 sucesivamente la parte entera del número decimal que se quiere convertir a binario y las partes fraccionarias que se vayan obteniendo en los productos sucesivos. El número en binario se formará con las partes enteras, que serán siempre 0 o 1, de los productos obtenidos, como se puede ver en el siguiente ejemplo. Ejemplo 4. 0,1875)10 en decimal es: 0,1875)10 = 0.0011)2 1 0,1875 x 2 0,3750 0,3750 x 2 0,7500 0,7500 x 2 1,5000 0,5000 x 2 1,0000 Capítulo 2: Representación de la información en las computadoras. Página 5. Ejemplo 5. Transformar a binario el número decimal 77,423 a) Parte entera: 77 2 1 38 2 0 18 2 0 9 2 1 4 2 0 2 1 b) Parte fraccionaria: 0,423 0,846 0,692 x 2 x 2 x 2 0,846 1,692 1,384 Es decir: 77,423)10 = 1101001,01101…)2 2 1 0,384 x 2 0,768 0,768 x 2 1,536 En este último ejemplo se observa que un número decimal con cifras fraccionarias pude dar lugar a un número binario con un número de cifras fraccionarias mucho mayor o incluso infinito. En la computadora si el número binario se almacena con número prefijado de bits se producirá un error de truncamiento. 2.3. Operaciones aritméticas con variables binarias. Una variable binaria puede representar, entre otras cosas, una cifra de un número en binario o una variable booelana. Las operaciones aritméticas básicas son suma, resta, multiplicación y división. Al ser la representación en binario una notación ponderada (es decir que verifica la expresión 2), estas operaciones son análogas a las realizadas en decimal pero hay que usar para cada posición las tablas siguientes, según la operación aritmética a realizar. Tabla 2. Suma aritmética. Tabla 3. Resta aritmética. a b a+b a b ab 0 0 0 0 0 0 0 1 1 0 1 1 y me adeudo 1 1 0 1 1 0 1 1 1 0 y me llevo 1 1 1 0 Tabla 4. Multiplicación aritmética. Tabla 5. División aritmética. a b axb a b a/b 0 0 0 0 0 indeterminado 0 1 0 0 1 0 1 0 0 1 0 infinito 1 1 1 1 1 1 Capítulo 2: Representación de la información en las computadoras. Página 6. Se observa que multiplicar por 10 en binario (es decir, por 2 en decimal) equivale a añadir un cero la derecha, o a desplazar el punto decimal a la derecha, siendo similar a multiplicar por 10 un número decimal. De igual forma, dividir por 10 en binario (es decir, por 2 en decimal) se hace desplazando el punto decimal a la izquierda, o eliminando ceros a la derecha. Ejemplo 6. 101011,101)2 x 2 1101,1011)2 x 25 1010100)2 / 2 10110,101)2 / 26 = 1010111,01)2 = 110110110)2 = 101010)2 = 0,010110101)2 2.4. Representación en complementos. Para representar un número negativo se puede usar el “complemento de ese número a la base” o “complemento de ese número a la base menos uno del sistema de numeración” usado. Así, como se verá después, las sumas y restas quedan reducidas a sumas, independientemente del signo de los operandos. Este sistema de representación es muy interesante en el caso de las computadoras, ya que si se usa se reduce la complejidad de los circuitos de la unidad aritmético – lógica. El complemento a la base menos uno de un número, N, es el número que resulta de restar cada una de las cifras de N a la base menos uno del sistema de numeración que se esté utilizando. Se pueden restar dos números sumando al minuendo el complemento a la base menos uno del sustraendo. Si existe acarreo en el resultado, éste se descarta y se suma al resultado así obtenido. Ejemplo 7. - En base 10. El complemento a la base menos uno (es decir, a nueve) de 63 es 36; ya que 99 – 63 = 36. El complemento a nueve de 16 es 83; ya que 99-16 = 83. Supóngase que se desea efectuar las operaciones 77 – 63 y 1.100 – 16. Para hacerlo obteniendo el complemento del sustraendo, al calcular este complemento debe considerarse con el mismo número de cifras el minuendo y el sustraendo y para ello se añaden ceros a la izquierda si es necesario 77 77 o 63 + 36 14 (1) 13 + 1 14 1100 0016 1084 o bien, complemento a 9 de 16 9999 – 0016 9999 + 9983 9983 (1)0001 + 0001 1084 - En base 2. El complemento a la base menos uno (es decir, a uno) del número 10010 es 01101 11111 10010 01101 El complemento a uno de 101010 es 010101 Capítulo 2: Representación de la información en las computadoras. Página 7. 111111 101010 010101 Restar 1000111 10010 1000111 0010010 0110101 o usando el complemento a uno de 0010010 = 1101101 1000111 1101101 (1)0110100 + 0000001 0110101 Se observa claramente que para transformar un número binario, N, a complemento a 1 basta con cambiar en N los unos por los ceros y viceversa. El complemento a la base de un número, N, es el número que resulta de restar cada una de las cifras de N a la base menos uno del sistema de numeración que se esté utilizando y, posteriormente, sumar uno a la diferencia obtenida. Se pueden restar dos números sumando al minuendo el complemento a la base del sustraendo y, despreciando, en su caso el acarreo del resultado. Ejemplo 8. - En base 10. El complemento a 10 del número 63 es 37 99 36 63 y + 01 36 37 El complemento a 10 del número 16 es 84 99 83 16 y + 01 83 84 Supóngase que queremos efectuar las siguientes operaciones: 7763 y 100 – 16. Se pueden realizar de forma directa: 7763 = 14; 100 – 16 = 84, o bien, utilizando el complemento del sustraendo. 77 100 + 37 y + 84 (1)14 (1)84 El complemento a 2 del número 10010 es 01110 11111 01101 10010 y + 00001 01101 01110 El complemento a 2 del número 101010 es 010110 111111 010101 101010 y + 000001 010101 010110 Capítulo 2: Representación de la información en las computadoras. Página 8. Supóngase que queremos efectuar las siguientes restas: 11001 10010 y 110000 – 101010. Se pueden realizar de forma directa: 11001 10010 = 00111; 110000 – 101010 = 00110, o bien, utilizando el complemento del sustraendo. 11001 110000 + 01110 y + 010110 (1)00111 (1)001110 Se observa claramente que para transformar un número binario, N, a complemento a 2 basta con cambiar en N los unos por los ceros y los ceros por los unos y sumar 1 al resultado. Como resumen de las definiciones dadas y al generalizar se tiene que: Complemento a la base, b, de un número N de n cifras es (bn N). Complemento a la base, b –1, de un número N de n cifras es (bn – N 1). 2.5. Códigos intermedios. Los códigos intermedios se fundamentan en la facilidad de transformar un número en base 2 a otra base que sea una potencia de 2 (22 = 4; 23 = 8; 24 = 16, etc.), y viceversa. Usualmente se utilizan como códigos intermedios los sistemas de numeración en base 8 (u octal) y en base 16 (o hexadecimal). 2.5.1.Base octal. En la base octal, b = 8 y el conjunto de símbolos utilizado es: {0, 1, 2, 3, 4, 5, 6, 7} Un número octal puede pasarse a binario aplicando los algoritmos vistos con anterioridad en la Pregunta 2.1. No obstante, al ser b = 8 = 23, puede hacerse la conversión con facilidad de la siguiente forma. Para transformar un número binario a octal se forman grupos de tres cifras binarias a partir del punto decimal hacia la izquierda y hacia la derecha. Posteriormente se efectúa directamente la conversión a octal de cada grupo individual. Si al formar los grupos de cifras ocurre que existe un grupo que no está completo (tienes menos de 3 cifras) se completa con ceros por la izquierda si el grupo está a la izquierda del punto decimal o por la derecha si el grupo está a la derecha. Como en la práctica sólo es necesario hacer la conversión a octal (o a decimal) de cada uno los grupos de tres cifras, basta con memorizar la Tabla 1 para poder realizar rápidamente la conversión a octal. Ejemplo 9. nº binario nº octal 10 2 101 110 100 , 111 5 6 4 , 7 nº binario nº octal 10 2 110)2 = 26)8 6 10)2 = 2.564,74)8 4 De octal a binario se pasa sólo convirtiendo individualmente a binario (tres bits) cada cifra octal, manteniendo el orden del número original. Ejemplo 10. 576,34)8 = 132,22)8 = 101 111 110 , 011 100)2 5 7 6 , 3 4 001 011 010 , 010 010)2 1 3 2 , 2 2 Capítulo 2: Representación de la información en las computadoras. Página 9. Para pasar de un número octal a decimal se aplica la expresión (2) con b = 8. Para pasar un número entero decimal a octal se hacen sucesivas divisiones enteras del número y los sucesivos cocientes por 8 (tal y como se hacía por 2). Para transformar la parte fraccionaria de un número decimal a octal se hacen sucesivos productos por 8 (igual que cuando para pasar a binario se hacía por 2). Ejemplo 11. 1.367,25)8 = 759,328125)10 1.367,25)8 = (1 x 83) + (3 x 82) + (6 x 81) +(7 x 80) + (2 x 8-1) +(5 x 8-2) = 512 + 192 + 48 + 7+ 0,25 + 0,078125 =759,328125)10 760,33)10 = 1.370,2507)8 Parte entera: 760 8 40 95 8 0 15 11 8 3 1 7 Parte fraccionaria: 0,33 x 8 2,64 0,64 x 8 5,12 0,12 x 8 0,96 0,96 x 8 7,68 2.5.2.- Base hexadecimal. Para representar un número en la base hexadecimal, b = 16, es necesario disponer de un conjunto o alfabeto de 16 símbolos. Se suele usar el siguiente conjunto: {0, 1, 2, 3, 4, 5, 6, 7, 8,9, A, B, C, D, E, F} los valores binarios y decimales que corresponden a las cifras hexadecimales se muestran en la siguiente tabla. Hexadecimal Decimal Binario 0 0 0000 1 1 0001 2 2 0010 3 3 0011 4 4 0100 5 5 0101 6 6 0110 7 7 0111 8 8 1000 9 9 1001 A 10 1010 B 11 1011 C 12 1100 D 13 1101 E 14 1110 F 15 1111 Tabla 6. Cifras hexadecimales y sus valores decimal y binario. Al ser b = 16 = 24, se puede hacer que las conversiones de binario a hexadecimal y viceversa, de forma análoga al sistema octal. Pero aquí utilizaremos grupos de 4 bits en lugar de grupos de 3 bits. Capítulo 2: Representación de la información en las computadoras. Página 10. Si al formar los grupos de cifras ocurre que existe un grupo que no está completo (tienes menos de 4 cifras) se completa con ceros por la izquierda si el grupo está a la izquierda del punto decimal o por la derecha si el grupo está a la derecha. Ejemplo 12. nº binario nº hexadecimal 10 2 0101 5 1110 E 1010 A , , 1011 B 110)2 = 2.5EA,BC)H C es decir: 0010 0101 1110 1010, 1011 1100 = 2.5EA,BC)H Ejemplo 13. nº hexadecimal nº binario 1 0001 A 1010 D 1101 E 1110 7 0111 , , E 1110 4)H 0100)2 es decir: 1A.DE7,E5)H = 1 1010 1101 1110 0111,1110 01)2 De la misma manera que manualmente es muy fácil convertir números de binario a octal y viceversa, y de binario a hexadecimal y viceversa, también es sencillo hacer estas conversiones electrónicamente o a través de un programa, por lo que a veces la computadora usa este tipo de notaciones intermedias internamente o como E/S. Para transformar un número de hexadecimal a decimal se aplica la expresión (2) con b = 16. Para pasar un número entero decimal a hexadecimal se hacen sucesivas divisiones enteras del número y los sucesivos cocientes por 16 (tal y como se hacía por 2 o por 8). Para transformar la parte fraccionaria de un número decimal a hexadecimal se hacen sucesivos productos por 16 (tal y como se hacía por 2 o por 8). Ejemplo 14. B.3D7,A4)H = 759,328125)10 B.3D7,A4)H = (11 x 163) + (3 x 162) + (13 x 161) +(7 x 160) + (10 x 16-1) +(5 x 16-2) = 45.056 + 768 + 208 + 7+ 0,625 + 0,01953125 = 46.039,64453125)10 9372,79)10 = C.942,CA3D)H Parte entera: 9372 16 137 585 16 92 105 36 16 4 2 12 9 Parte fraccionaria: 0,79 x 16 12,64 0,64 x 16 10,24 0,24 x 16 3,84 0,84 x 16 13,44 El código octal se suele utilizar cuando el número de bits es múltiplo de 3, y el código hexadecimal cuando dicho número es múltiplo de 4. Capítulo 2: Representación de la información en las computadoras. Página 11. 3.- CÓDIGOS DE ENTRADA/SALIDA. Ya se comentó al principio del tema que los códigos de entrada/salida o códigos externos son códigos que asocian a cada carácter (alfabético, numérico o especial) una determinada combinación de bits. En otras palabras, un código de E/S es una correspondencia entre los conjuntos: = {A, B, C, D,..., Z, a, b,..., z, 0,1, 2, 3,..., 9, /, +, (, ),...) y = {0,1}n El número m de elementos del conjunto depende del dispositivo o sistema informático o de codificación de E/S que se esté utilizando. Supóngase que se utiliza un número fijo, n, de bits para codificar los símbolos de . El valor mínimo de n dependerá de m, número de elementos de . Así: Con 2 bits (n = 2) podemos hacer 4 combinaciones distintas, con lo que podemos codificar hasta 4 símbolos (m = 4) distintos. Con 3 bits (n = 3) podemos hacer 8 combinaciones distintas, con los que podemos codificar hasta 8 símbolos (m = 8) distintos. Con n bits podemos codificar m = 2n símbolos distintos. Es decir, se verifica que para codificar m símbolos diferentes se necesitarán n bits, siendo, n log2 m = 3.32 log (m) (9) como en la práctica n debe ser entero, n será el menor número entero que verifique lo anterior. Ejemplo 15. Para codificar las 10 cifras decimales {0, 1, ..., 9}se necesitarán: n = 3,3221 . log (m) = 3,322 bits es decir, 4 bits (con 3 sólo podemos codificar 8 símbolos). Dos codificaciones posibles ejemplo son las que se muestran en la Tabla 7. Obsérvese que, por lo menos, se necesitan 4 bits, pero pueden hacerse codificaciones con más bits de los necesarios. Con 4 bits no se usan 2410 = 6 combinaciones, y con 5 bit 2510 = 22 combinaciones. Uno de los códigos usuales, ASCII, suele utilizar unos 95 caracteres (es decir, m = 95), por lo que el número de bits mínimo para codificarlos es 7, ya que 26 < 95 < 27. Alfabeto 0 1 2 3 4 5 6 7 8 9 Código 1 0000 1000 0100 1100 0010 1010 0110 1110 0001 1001 Código 2 00000 10001 01001 11000 00101 10100 01100 11101 00011 10010 Tabla 7. Dos codificaciones posibles para 10 símbolos decimales. Como se ha hecho en este ejemplo para los 10 símbolos decimales (Tabla 7), se podrían establecer códigos de E/S de forma totalmente arbitraria y con un número de bits, n, dado por la expresión 9. Obviamente existen códigos normalizados, que suelen ser usados por los constructores de computadoras. Algunos de estos códigos se muestran en la Tabla 8, allí, por comodidad, se representa la codificación en octal o hexadecimal en vez de en binario. Capítulo 2: Representación de la información en las computadoras. Página 12. Código “BCD de intercambio normalizado” (Standard Binary Coded Decimal Interchange Code). Usualmente este código usa n = 6 bits, con lo que con él se pueden representar m = 26 = 64 caracteres. A veces se añade a su izquierda un bit adicional para verificar posibles errores en la transmisión o grabación del código (bit de paridad, criterio impar, etc.), de forma que en este caso cada carácter queda representado por n = 7 bits, tal como se muestra en la Tabla 8. Las cuatro posiciones de la derecha se denominan (ver Figura 1) bits de posición y para los caracteres numéricos de 1 a 9 el código de los bits de posición coincide con la representación en binario natural de dichos números (código BCD para dígitos decimales) y para el 0 con la representación del 10; es por este motivo por lo que este código se denomina BCD, decimal codificado en binario. Los dos siguientes bits (bit 4 y 5) se denominan bits de zona, siendo éstos 00 para los caracteres numéricos. El último bit, 6, que es un bit opcional, es el bit de verificación citado en el párrafo anterior. Bit de verificación. C Bit 6 Bits de posición. Bits de zona. B 5 A 4 8 3 4 2 2 1 1 0 Figura 1. Formato usado en el código BCD de intercambio normalizado. Ejemplo 16. Si en un teclado que utiliza el código BCD de intercambio normalizado se pulsan los siguientes caracteres: 754.32 BEATRIZ se genera la siguiente secuencia de bits: (ver Tabla 3.8, columnas 1 y 3): 754.32 BEATRIZ)BCD = 000 0111 100 0101 000 0100 011 1011 100 0011 000 0010 100 0000 011 0010 111 0101 011 0001 001 0011 010 1001 111 1001 001 1001 Código EBCDIC (Extended Binary Coded Decimal Interchange Code). El código EBCDIC utiliza n = 8 bits para representar cada carácter, con el significado que se indica en la Figura 2. En la Tabla 8 se incluye, en hexadecimal, el código correspondiente a cada carácter. Figura 2. Significado de los campos en la codificación EBCDIC. Este tipo de codificación permite codificar hasta m = 28 = 256 símbolos distintos, es decir, permite representar una gran variedad de caracteres: incluye las letras minúsculas y un mayor número de caracteres especiales. También es posible, y se hace con las combinaciones que empiezan por 00, codificar caracteres de control que suministran órdenes o señales de control, p.e., para impresoras, pantallas o para coordinar las transmisiones de información. Código ASCII (American Standard Code for Information Interchange). El código ASCII utiliza 7 bits y, hoy día, es de los más usados. Se puede decir que la mayor parte de las transmisiones de datos entre dispositivos se realizan en esta codificación. Usualmente se incluye un octavo bit para detectar posibles errores de transmisión o grabación (bit de paridad). En la columna 5 de la Tabla 8 se incluyen los caracteres ASCII usuales, las combinaciones restantes de 7 bits (hasta 128) se suelen utilizar como caracteres de control y caracteres gráficos. Capítulo 2: Representación de la información en las computadoras. BCD de intercambio EBCDIC Caracter normalizado (hexadecimal) (octal) A B C D E F G H I J K L M N O P Q R S T U V W X Y ASCII (octal) BCD de intercambio EBCDIC Caracter normalizado (hexadecimal) (octal) Z 061 062 163 064 165 166 067 070 171 141 142 043 144 045 046 147 150 051 122 023 124 025 026 127 130 131 C1 C2 C3 C4 C5 C6 C7 C8 C9 D1 D2 D3 D4 D5 D6 D7 D8 D9 E2 E3 E4 E5 E6 E7 E8 E9 101 102 103 104 105 106 107 110 111 112 113 114 115 116 117 120 121 122 123 124 125 126 127 130 131 132 a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 112 001 002 003 004 005 006 007 010 011 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 060 061 062 063 064 065 066 067 070 071 SP ! " # $ % 100 052 40 5A 7F 7B 5B 6C 040 041 042 043 044 045 & ' ( ) * + . : ; < = > ? @ [ ] 013 133 034 Página 13. 160 114 034 174 177 160 040 073 015 156 076 013 016 172 116 ASCII (octal) 81 82 83 84 85 86 87 88 89 91 92 93 94 95 96 97 98 99 A2 A3 A4 A5 A6 A7 A8 A9 141 142 143 144 145 146 147 150 151 152 153 154 155 156 157 160 161 162 163 164 165 166 167 170 171 172 50 7D 4D 5D 5C 4E 60 4B 7A 5E 4C 7E 6E 6F 7C 4D 5D 046 047 050 051 052 053 055 056 072 073 074 075 076 077 100 133 135 Tabla 8. Algunos códigos de entrada/salida utilizados es Informática. Capítulo 2: Representación de la información en las computadoras. Página 14. 4.- DETECCIÓN DE ERRORES EN LA INFORMACIÓN CODIFICADA. Ya se comentó que si representamos cada carácter por un número fijo de bits, para representar m símbolos distintos necesitamos al menos n bits, siendo n el menor número entero que verifica la relación n log2 m = 3.32 log (m). También se dijo que a veces no es necesario utilizar todas las combinaciones posibles de los n bits. Cuantas menos combinaciones se desperdicien (es decir, no correspondan a símbolos a codificar) decimos que el código es más eficiente. La eficiencia de un código () se define como el cociente entre el número de símbolos que se representan realmente, m, dividido por el número, m', de símbolos que en total pueden representarse; es decir, con códigos binarios en que m' = 2n, se tiene: = m /m’ = m/ 2n con 0 1 Lógicamente cuanto más cerca éste de 1, más eficiente será el código. A veces, las redundancias se introducen deliberadamente para poder detectar posibles errores en la transmisión o grabación de información. Así, por ejemplo, si necesitamos transmitir 8 símbolos {A, B, C, D, E, F, G y H} y se hace con un código sin redundancias, necesitamos n = 3 bits, y un código posible puede ser el Código 1 de la Tabla 9. Caso de que por algún error varíe uno de los bits, obtenemos otro símbolo del alfabeto, que considerado por sí mismo (es decir, aisladamente) no puede ser detectado como erróneo. Si se utilizase un código redundante, tal como el Código II de la Tabla 9, existirían algunas posibilidades de detectar errores. Así, por ejemplo, si se transmite el símbolo H, esto es 0111, y por un error en la transmisión cambiase el primer bit, esto es, se recibiese 1111, podría detectarse el error, ya que 1111 no corresponde a ninguno de los símbolos posibles. Alfabeto A B C D E F G H Código 1 000 001 010 011 100 101 110 111 Código 2 0000 0001 0010 0011 0100 0101 0110 0111 Tabla 9. Introducción de redundancias en un código. Las redundancias se introducen de acuerdo con algún algoritmo predeterminado; de esta manera, los códigos pueden ser verificados automáticamente por circuitos de la computadora o periféricos, especializados en este objetivo. Uno de estos algoritmos añade al código inicial de cada carácter un nuevo bit denominado bit de paridad. Existen dos criterios para introducir este bit: Bit de paridad, criterio par: se añade un bit (0 o 1) de forma tal que el número total de unos del código que resulte sea par. Bit de paridad, criterio impar: se añade un bit (0 o 1) de forma tal que el número total de unos del código que resulte sea impar. El bit de paridad se introduce antes de transmitir o grabar la información (en la memoria principal, cinta o disco magnético ). Por ruido o interferencias en la transmisión o defecto del soporte de información puede eventualmente cambiar un bit (de 1 a 0 o de 0 a 1 ). Si en el receptor o al leer la información se comprueba la paridad, se detectaría el error, ya que el número de unos dejaría de ser par (en el caso de criterio par) o impar (en el caso de criterio impar). En el caso de transmisión de datos, automáticamente se podría provocar una nueva transmisión del carácter erróneo. Obviamente, si se produjese el cambio simultáneo de dos bits distintos, no se detectaría el error de paridad; ahora bien, esta eventualidad es mucho menos probable que la de que cambie un solo bit. Capítulo 2: Representación de la información en las computadoras. Ejemplo 17. Mensaje o código inicial 100 0001 101 1011 101 0000 110 1000 Página 15. Mensaje con bit de paridad (criterio par) 0 100 0001 1 101 1011 0 101 0000 1 110 1000 bit de paridad Mensaje o código inicial 000 0000 100 0011 101 0000 110 1000 Mensaje con bit de paridad (criterio impar) 1 000 0000 0 100 0011 1 101 0000 0 110 1000 bit de paridad En la Tabla 8 el bit más a la izquierda de los códigos BCD de intercambio normalizado es un bit de paridad según el criterio par. También el código 2 de la Tabla 7 incluye un bit de paridad según el criterio par. Existen otros sistemas de introducir redundancias para poder detectar errores. Uno de ellos es el denominado de verificación de cuenta fija. En este tipo de sistema todos los códigos correspondientes a los caracteres tienen un número fijo de unos y ceros, siendo la posición relativa de los mismos la que determina el carácter a que corresponden. Por ejemplo, si quisiésemos codificar 70 símbolos distintos podríamos utilizar 8 bits, de los cuales siempre 4 deben ser unos y los otros 4 ceros. Los circuitos de verificación tendrían que detectar en recepción o lectura, si el número de unos (o ceros) de cada carácter coincide con el número prefijado. 5.- REPRESENTACIÓN INTERNA DE LA INFORMACIÓN. Como ya se ha comentado, en la computadora se procesan dos tipos de información: datos e instrucciones. En esta sección vamos a ver la representación interna de los datos. Según se comentó en el Tema 1, en la memoria y el procesador central la información se transmite y procesa en unidades denominadas palabras. Esto quiere decir que toda la información, a la hora de ser procesada por la unidad aritmético-lógica o ser transferida a la memoria principal, debe estructurarse en palabras. Debido a ello, y para hacer un buen aprovechamiento de la memoria, la longitud de la palabra debe ser un múltiplo entero del número de bits utilizados para representar un carácter. Así, por ejemplo, en las computadoras de 8, 16,32 o 64 bits se utilizan códigos de entrada/salida con n = 8 bits (EBCDIC o ASCII, con bit de paridad). Los datos se introducen inicialmente en la computadora según un código de entrada/salida, tanto si estos son de tipo alfabético como de tipo numérico. Los datos de tipo numérico se utilizan normalmente para operar aritméticamente con ellos, y la representación simbólica obtenida con el código de E/S no resulta adecuada para realizar este tipo de operaciones. Imaginemos, por ejemplo, que deseamos operar con el número 253, y supongamos que está representado en notación ASCII con bit de paridad par, es decir: 253)10 = 1011 0010 0011 0101 0011 0011)ASCII Este mismo número representado en binario natural es: 253)10 = 11111101)2 Capítulo 2: Representación de la información en las computadoras. Página 16. Resulta más adecuado operar con una notación basada en el sistema matemático de numeración convencional que en un código de E/S. Por otra parte, la representación con el código de E/S usa un número excesivo de bits frente a la representación en binario natural. Así que debemos buscar una representación más adecuada para realizar operaciones matemáticas. Por los motivos anteriores, y teniendo en cuenta que la unidad aritmético-lógica opera con palabras, se realiza una conversión de notaciones pasando de la representación simbólica de E/S a otra notación que denominaremos representación interna. La representación final o interna de los datos depende de la computadora o del lenguaje de programación utilizado y del uso que el programador desee hacer con los datos. Es decir, el usuario, según las reglas del lenguaje de programación que utilice, puede optar entre varias representaciones posibles. Supongamos, por ejemplo, que se realiza un programa en Pascal. Los datos pueden estar incluidos en el propio programa en forma de constantes o parámetros, o ser leídos por el propio programa en el momento de ejecutarse las correspondientes instrucciones de entrada del programa. Al introducirse el programa, desde el teclado, por ejemplo, todos los caracteres, sean numéricos o no, se graban según el código de E/S. Posteriormente, de acuerdo con las reglas del Pascal y las especificaciones de los tipos de las variables realizadas por el programador, se realiza una reconversión de representación de los datos. Los datos incluidos en el propio programa se reestructuran cuando el programa se traduce a lenguaje máquina y los datos leídos por el programa se reconvierten en el momento de ejecutarse las instrucciones correspondientes que indican claramente el tipo de representación deseada. 5.1.- Tipos de datos. Se conoce como dato cualquier objeto que pueda manipular la computadora. Un dato puede ser un carácter leído de teclado, información almacenada en un disco, un número que está en memoria principal, etc. Son datos tanto las constantes definidas dentro de los programas, que no alteran su valor durante la ejecución de los mismos, como las variables usadas es dichos programas. También son datos la información externa a los programas, a la que se puede acceder a través de algún procedimiento, ya esté dicha información almacenada en dispositivo de memoria auxiliar o se generada por algún periférico. Cuando se usa una computadora para resolver un problema, se debe hacer una abstracción del mismo y de las magnitudes o entidades que influyen en él. Dichas magnitudes deben ser representadas por datos. Para representar una entidad o magnitud como un dato, se establece una aplicación que establezca una correspondencia entre cada valor de la magnitud y un dato. Así, por ejemplo, para resolver un problema en que intervengan los alumnos de una facultad, es preciso tener una aplicación, T, del conjunto de valores de la magnitud alumnos, a, en un conjunto de datos D. Esta transformación es deseable que esté definida sobre todo el conjunto de valores de la magnitud, además es conveniente que sea unívoca, es decir, que a dos valores de magnitud distintos les asocie datos distintos. Para que se pueda operar con ]os datos es necesario que existan unas operaciones internas en el conjunto de datos, que sean semejantes a las operaciones usuales en el conjunto de magnitudes. Dichas operaciones deben cumplir que: la imagen según la transformación T del resultado de una operación en el conjunto de magnitudes, sea igual al resultado de las operaciones correspondientes en el conjunto de datos sobre las imágenes de los operandos. Si denotamos por + la suma en el conjunto de magnitudes, d, lo dicho anteriormente implica que debe existir una operación sobre el conjunto de datos, D, que cumpla: T (x + y) = T (x) T(y) = X Y x, y d Capítulo 2: Representación de la información en las computadoras. Página 17. Para que los resultados obtenidos en el conjunto de datos, D, puedan ser interpretados, es necesario que exista una transformación inversa, T-1, de éstos al conjunto de magnitudes, d. Esta aplicación T-1 hará corresponder a cualquier dato, X, un valor de magnitud, x, cuya imagen por T es el propio dato X. Se denomina tipo de dato al conjunto de la transformación, T, y de las operaciones y funciones internas y externas definidas sobre el conjunto de datos. Distintas transformaciones darán lugar a diferentes tipos de datos, aun cuando el conjunto de datos origen a representar sea el mismo. A continuación se verán algunos de los tipos de datos básicos más usuales en Informática: entero, real, carácter y lógico. Nos encontraremos tipos de datos en la representación de la información, tanto a nivel físico de la computadora, como en los lenguajes de programación. No todos los tipos de datos existen en todos los lenguajes de programación. Hay lenguajes más ricos que otros en tipos de datos. 5.1.1. Datos de tipo entero. El tipo entero es una representación del conjunto de los números enteros. La representación es posible para un subrango de números enteros centrado en el origen: entre 2n-1 – 1 y -2n-1. La razón de esta limitación está en la necesidad de utilizar un espacio finito y fijo, para cada dato, y en el hecho de que la transformación realizada entre los números enteros y el tipo de datos consiste en representar el número en binario y almacenarlo con un número fijo de bits. El número de datos distintos de tipo entero que se pueden generar, cardinalidad del tipo, es 2 (donde n es el número de bits que se utiliza en la representación). Por tanto, si se modifica el número de bits, n, se obtienen distintos tipos enteros. En consecuencia, no todos los números enteros se pueden representar. n A cada operación aritmética sobre el conjunto de los números enteros se le asocia, en el tipo entero, la operación correspondiente. Estas operaciones no pueden realizarse sobre cualquier par de datos enteros, ya que aparecen indeterminaciones debidas a la propia representación. Así, si el máximo valor positivo de tipo entero es 32.767 (si la representación se realiza con n = 16), al realizar la operación: 32.767 + 1 se obtendría un resultado no representable en el tipo. Este tipo de error se conoce como desbordamiento u overflow. Cuando esto sucede, la computadora puede, o no, avisar al usuario. En cualquier caso se obtendrá como resultado algún dato de tipo entero, pero éste no corresponderá con el valor que se obtendría al realizar la misma operación con números enteros. En el caso anterior el número generado sería -32.768, si la representación es en complemento a 2. Cualquier operación con datos de tipo entero es exacta salvo que se produzcan desbordamientos. 2.1.2. Datos de tipo real. El tipo de datos reales es una representación del conjunto de los números reales. Esencialmente la transformación realizada consiste en expresar el número en la forma: N= M x BE donde N es el número real a representar, B es la base utilizada para el exponente (que puede estar prefijada para una computadora dada), E es el exponente del número y M es la mantisa. El número se almacena en la computadora yuxtaponiendo el signo, el exponente y la mantisa, cada uno con un número de bits prefijado. Capítulo 2: Representación de la información en las computadoras. Página 18. Esta representación no permite almacenar números muy grandes o muy pequeños (del orden de 1064 o 10-64), lo que conlleva que se produzcan desbordamientos. Por otra parte, la limitación del número de bits usados para representar la mantisa provoca una falta de precisión en la representación. Esto es debido a que la aplicación que define al tipo real no es unívoca. Es decir, cada dato de tipo real es la imagen de un conjunto infinito de números reales, concretamente representa a un intervalo de la recta real. Para los datos de tipo real están definidas las operaciones aritméticas. La suma y la multiplicación de datos de tipo real cumplen la propiedad conmutativa, pero no siempre la asociativa ni la distributiva. Esto sucede porque el orden en que se realizan las operaciones influye en el resultado. En cada operación se producen errores por falta de precisión en la representación (errores de redondeo), que se acumulan durante todo proceso de cálculo. Los errores de redondeo son especialmente importantes cuando aparecen, directa o indirectamente, cancelaciones. Esto ocurre, por ejemplo, cuando en una expresión se suma una cantidad grande, en comparación con e1 valor de la expresión, lo que hace que se pierdan los dígitos menos significativos y, posteriormente, se resta dicha cantidad, u otra del mismo orden de magnitud. Usualmente, en una computadora se pueden utilizar diversos tipos de datos reales: simple, doble o cuádruple precisión; dependiendo del número de bits que se dedican a representar la mantisa o el exponente. 5.1.3. Datos de tipo lógico. Los datos de tipo lógico representan valores lógicos o booleanos. Pueden tomar uno de entre dos valores: verdadero o falso (abreviadamente V, F o 0, 1). Sobre los valores lógicos pueden actuar los llamados operadores lógicos. Los operadores lógicos fundamentales son: Y, O y NO (en inglés: AND, OR y NOT, respectivamente). La definición de las operaciones se hace indicando su resultado para las cuatro posibles combinaciones de valores de los argumentos. En algunos lenguajes de programación hay definidos sobre estos datos otros operadores logicos, como son: NO-Y, NO-O y NO-exclusivo (en inglés: NAND, NOR y XOR). En la Tabla 10 se muestra la descripción de estas funciones. a 0 b 0 aYb 0 aOb 0 a NoY b 1 a NoO b 1 a Xor b 0 No a 1 0 1 0 1 1 0 1 1 1 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 Tabla 10. Funciones lógicas. Un caso particularmente importante del valor de tipo lógico es el que se obtiene como resultado al realizar una operación de relación sobres datos de un tipo, sobre el que existe definida una relación de orden (enteros, reales, carácter, etc.). Una relación es una expresión formada por dos operandos que pertenecen a un mismo tipo y un operador de relación. Son operadores de relación: (mayor o igual), > (mayor), (menor o igual), < (menor), = (igual), distinto, etc. El resultado de una operación de relación es un valor de tipo lógico, que será “verdadero” si la relación expresada es cierta, y “falso” en caso contrario. Capítulo 2: Representación de la información en las computadoras. Página 19. 5.1.4.- Datos de tipo carácter. Los datos de tipo carácter representan elementos individuales de conjuntos finitos y ordenados de caracteres. El conjunto de caracteres representado depende de la computadora. Uno de los conjuntos más usados es el ASCII. No hay ninguna operación interna definida sobre datos de tipo carácter, salvo la asignación (A = ”B”). Normalmente existen funciones de conversión de tipo, como por ejemplo, la que asocia a cada dato de tipo carácter un valor entero, que indica su posición en el código. 5.2.- Representación interna de los tipos de datos. La representación interna de los datos de tipo lógico es muy variada. Así en algunas computadoras, para representar el 1 o el 0 lógico se hacen 1 o 0 todos los bits de la palabra. En otras, el 1 o el 0 lógico se representa haciendo l o 0 el bit situado más a la derecha de la palabra. Y en algunas otras, el 0 lógico se representa haciendo 0 todos los bits y el l lógico basta con que al menos un bit de la palabra sea 1. Los datos tipo carácter, representan sencillamente cadenas de caracteres ensambladas en las palabras del ordenador y se almacenan usando el código de entrada y salida que se utiliza en la computadora, y no se necesita ninguna transformación para manejarlos, es decir, no es necesario efectuar ninguna conversión de representación. Para almacenar frases o palabras la computadora utiliza conjuntos de caracteres. Los datos de tipo entero y tipo real son los más utilizados, y la mayoría de otros tipos y estructuras de datos se basan en ellos, por eso analizamos su representación en detalle. 5.2.1.- Representación interna de datos de tipo entero. Vamos a distinguir dos formas distintas de representar en el interior de la computadora los datos de tipo entero; éstas son representación binaria y representación de dígitos decimales codificados en binario (o representación BCD). 5.2.1.1.- Datos de tipo entero representados en binario. Se supone que en la computadora se reservan n posiciones (incluida la del signo) para representar el dalo, N. El bit más significativo (MSB: "Most Significative Bit") se representa como an-1 y el menos significativo como a0. Existen dos alternativas de representación: Posición 15 14 13 12 13 12 11 10 9 8 7 6 5 4 3 2 1 0 a) Sin signo N>0 Posición 15 14 13 12 13 12 11 10 9 8 7 6 5 4 3 2 1 0 b) Signo y magnitud o complemento a 1 o complemento a 2 S N Posición 15 14 13 12 13 12 11 10 9 8 7 6 5 4 3 2 1 0 c) Sesgado N+S N: binario natural, o complemento a 1, o complemente a 2. Posición 15 14 13 12 13 12 11 10 9 8 7 6 5 4 3 2 1 0 d) BCD empaquetado BCD BCD Figura 3. Esquemas de diferentes representaciones de datos de tipo entero. Capítulo 2: Representación de la información en las computadoras. Página 20. A) Enteros sin signo. En este caso todos los bits del dato representan su valor absoluto, véase Figura 3.a. Así con 8 bits se pueden representar los números desde el 0 hasta el 255, ya que 28 = 256 y el número 1111 1111)2 = 255)10. B) Enteros con signo. En este caso existen cuatro formas de representación interesantes: Signo y magnitud.- El signo se representa con el bit situado más a la izquierda del dato (bit an-1), Figura 3.b. Este bit será 0 si el número es positivo y 1 si el número es negativo. En el resto de bits, desde an-2 hasta a0, se representa el valor absoluto del número en binario natural. Complemento a 1.- El signo se representa con el bit situado más a la izquierda del dato (bit an-1), Figura 3.b. Este bit será 0 si el número es positivo y 1 si el número es negativo. Si el número es positivo, en el resto de bits (an-2 a a0) se representa el valor del número en binario natural. Si el número es negativo, en el resto de bits (an-2 a a0) se representa en complemento a 1 del valor absoluto del número en binario natural. Complemento a 2.- El signo se representa con el bit situado más a la izquierda del dato (bit an-1) , Figura 3.b. Este bit será 0 si el número es positivo y 1 si el número es negativo. Si el número es positivo, en el resto de bits (an-2 a a0) se representa el valor del número en binario natural. Si el número es negativo, en el resto de bits (an-2 a a0) se representa en complemento a 2 del valor absoluto del número en binario natural. Sesgada.- En esta representación, Figura 3.c, sencillamente se le suma al número N, el sesgo 2n-1, de forma tal que el número que se obtiene siempre es positivo. Así que no es necesario reservar explícitamente un bit par el signo. Nº. decimal Tipo de representación. Signo y magnitud Complemento a 1 Complemento a 2 Sesgado 7 6 5 4 3 2 1 0 0111 0110 0101 0100 0011 0010 0001 0000 0111 0110 0101 0100 0011 0010 0001 0000 0111 0110 0101 0100 0011 0010 0001 0000 1111 1110 1101 1100 1011 1010 1001 1000 -0 -1 -2 -3 -4 -5 -6 -7 -8 ---1001 1010 1011 1100 1101 1110 1111 ---- 1111 1110 1101 1100 1011 1010 1001 1000 ---- ---1111 1110 1101 1100 1011 1010 1001 1000 ---0111 0110 0101 0100 0011 0010 0001 0000 Tabla 11. Alternativas de representación de datos de tipo entero con signo para n =4 bits. Capítulo 2: Representación de la información en las computadoras. Página 21. En la Tabla 10 se muestra un ejemplo de cómo se representarían los números enteros con signo, en los cuatro casos posibles de representación, suponiendo una longitud de datos de n = 4 bits. De la observación de esta tabla se puede concluir que: a) El mayor número positivo, a, que se puede almacenar es a = 7 = 24-1 -1, o generalizando, para una palabra de n bits. a = 2n-1- 1 b) Cuando se utiliza la notación en complemento a 1, en los números negativos (caso de Sperry-Univac 1100, por ejemplo): 1) Existen dos representaciones para el cero: en la Tabla 11, 0000 ("cero positivo") y 1111 ("cero negativo"). Esto es un inconveniente, ya que el programa traductor tendrá que prever dos comprobaciones, en lugar de una, en las instrucciones de comparación con cero. 2) El número más negativo, b (Figura 3), que se puede formar es b = -7 = -(24-1 - 1), o, generalizando para una palabra de n bits: b = -(2n-1 - 1) = -2n-1 + 1 c) Cuando se utiliza la notación en complemento a 2 (caso de IBM, Digital y Data General, por ejemplo): l) Existe una sola representación para el cero (0000), lo cual es una ventaja cuando se desee detectar este valor o un número negativo. 2) El número más negativo, b, que se puede formar corresponde a b = -8 = -24-1, o para palabras de n bits: b = -2n-1 es decir, admite un valor más para números negativos que en el caso de las representaciones en signo y magnitud, y en complemento a 1. La forma más ampliamente utilizada en la actualidad para representar los números enteros con signo es la de complemento a 2. Ello se debe a la facilidad de efectuar las sumas y restas con este tipo de representación. La representación sesgada se utiliza para representar los exponentes de los datos de tipo real. 5.2.1.2.- Datos enteros representados con dígitos decimales codificados en binario (BCD). En ocasiones, loa datos de tipo entero se representan internamente codificando de forma aislada cada dígito decimal con cuatro dígitos binarios, según la tabla 12. Así, en un byte se pueden representar 2 dígitos decimales (véase Figura 3.d), a esta representación se le conoce como BCD empaquetada, o bien representado un único dígito decimal en cada byte, obteniéndose así una representación BCD desempaquetada. Esta forma de codificar es poco eficiente, puesto que de las 24 = 16 combinaciones posibles de 4 bits (véase Tabla 6), sólo se pueden usar 10 (Tabla 12). No obstante, a veces se utiliza por la proximidad al sistema decimal y por la gran facilidad de codificar en BCD, sin más que considerar aisladamente cada dígito decimal según la Tabla 12; ya que los algoritmos de transformación de código de E/S a BCD y los circuitos decodificadores son muy sencillos. Dígito decimal 0 1 2 3 4 5 6 7 8 9 Valor binario 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 Tabla 12. Dígitos decimales codificados en binario (BCD). Capítulo 2: Representación de la información en las computadoras. Página 22. 5.2.2.- Representación interna de datos de tipo real. Cuando se opera con números muy grandes se suele utilizar, al igual que hace la computadora con todos los números reales, la notación exponencial. Es decir, que todo número, N, se puede expresar en la forma N = M x BE Podemos transformar la representación de N, conservando su valor, cambiando el exponente, E, y reajustando adecuadamente la mantisa, M: si aumentamos (disminuimos) en una unidad E, debemos dividir (multiplicar) M por B. Este tipo de representación de los números se denomina notación exponencial, aunque también recibe otros nombres como notación científica o notación en punto o coma flotante. La representación y manejo de los datos de tipo real puede ser responsabilidad del hardware de la computadora o de los traductores de lenguajes. Los microprocesadores actuales contienen internamente, en el mismo chip, los circuitos para operar en coma flotante y, en otros casos, se dispone de circuitos integrados para realizar específicamente estas operaciones (coprocesadores matemáticos o aritméticos). Si el hardware no dispone de circuitería para coma flotante, y un lenguaje de programación dispone de este tipo de datos, será el traductor correspondiente el que descomponga las operaciones en coma flotante en términos de las operaciones que presenta el lenguaje máquina, obteniéndose en este caso un rendimiento (velocidad) mucho menor en la ejecución de los programas. Hasta la década de los años ochenta puede decirse que cada fabricante de computadoras utilizaba un sistema propio para la representación de números reales; pero es de gran importancia que existan sistemas normalizados, ya que ello posibilita que los matemáticos construyan bibliotecas de programas de alta calidad, los diseñadores de computadoras puedan construir unidades aritmético - lógicas muy eficientes, y los fabricantes de circuitos integrados puedan construir aceleradores y coprocesadores aritméticos estándar. Debido a ello, de 1977 a 1985, la asociación IEEE desarrolló un sistema normalizado de representación, denominado Normalización IEEE 754 que es el que hoy día tiene mayor aceptación.