2. Representación de la Información en computadoras 2.1 Introducción Las computadoras digitales han hecho posible muchos avances científicos, industriales y comerciales que de otra manera nunca se hubieran alcanzado. La propiedad más sorprendente de una computadora digital es su generalidad. Puede seguir una secuencia de instrucciones, denominada programa, que opera según la información dada. La computadora digital de propósito general es el ejemplo mejor conocido de un sistema digital. Las primeras computadoras digitales se usaron principalmente para cálculos numéricos. En este caso, los elementos discretos que se utilizan son dígitos. Para esta aplicación surgió el término de computadora digital. Los elementos discretos de información se representan en un sistema digital mediante cantidades físicas denominadas señales. Las señales eléctricas como voltajes y corrientes son las más comunes. Las señales en todos los sistemas digitales en la actualidad tienen sólo dos valores discretos y se dicen que son binarios. Los números binarios son los más utilizados en las computadoras debido a la naturaleza de los dispositivos electrónicos. Es más sencillo construir un elemento que pueda estar normalmente abierto o cerrado (biestable) que otro de 10 estados posibles. La representación binaria se seguirá utilizando hasta que se descubra un dispositivo naturalmente dotado de perfecta estabilidad en 10 estados. 2.2 Sistemas de numeración En los sistemas de numeración no posicionales, el valor de una cifra no depende de la posición que ésta ocupe dentro del número. El ejemplo más conocido es el de los números romanos. La representación del número decimal 233 en el sistema de números romanos es: CCXXXIII Donde una C equivale a 100 una X equivale a 10 e I a la unidad En cambio en los sistemas de numeración posicionales el valor de una cifra depende del lugar que ésta ocupe dentro del número. Los sistemas decimal, hexadecimal, octal y binario son ejemplos de sistemas de numeración posicionales. En el número decimal 233 el dígito 3 figura dos veces, pero el de la derecha representa 3 unidades mientras que el de la izquierda representa dos decenas. Generalizando, en un sistema de numeración posicional de base b, la representación de un número se define a partir de la regla: (… a3 a2 a1 a0.a-1 a-2 a-3 …)b = … + a2 b2 + a1 b1 + a0 b0 + a-1 b-1 + a-2 b-2 + a-3 b-3 + … Ejemplo: El número 6923,72 puede obtenerse como la suma: 6000 900 unidades de mil centenas 20 3 0.7 0.02 ----------6923.72 decenas unidades décimas centémimas Es decir, 6923.72 = 6*103+9*102+2*101+3*100+7*10-1+2*10-2 Nótese que cuando b es diez y los ai se eligen del conjunto de dígitos ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ), pero cuando el sistema es base x se eligen dígitos del conjunto comprendido entre 0 y x-1. El punto que aparece entre los dígitos a0 y a-1 se denomina punto fraccionario. Cuando b es 10 se lo llama punto decimal y cuando b es 2, punto binario. Ejemplos en otras bases (423.1)6 = 4×62 + 2×61 + 3×60 + 1×6-1 (427.2)8 = 4×82 + 2×81 + 3×70 + 2×8-1 (101.1)2 = 1×22 + 0×21 + 1×20 + 1×2-1 (923.1)10 = 9×102 + 2×101 + 3×100 + 1×10-1 = (159.17)10 = (279.25)10 = (5.5)10 = (923.1)10 Observe el siguiente ejercicio de conversión de números enteros en distintas bases (base 10, base 4, base 8 y base 16) a números decimales. base 10 2 4 8 16 5 4 3 2 1 100000 10000 1000 100 10 32 16 8 4 2 1024 256 64 16 4 32768 4096 512 64 8 104857 65536 4096 256 16 6 Tabla 1-a base^n 0 1 1 1 1 1 8 1 número 28 b10 10101 b2 30321 b4 63170 b8 2BC6 b16 1 0 1 2 0 3 0 3 2 1 6 3 1 7 0 11 12 6 2 Tabla 1-b número 28 b10 10101 b2 30321 b4 0 0 0 16 0 0 0 768 0 0 20 4 0 48 8 Suma b10 8 28 1 21 1 825 63170 b8 2BC6 b16 0 24576 1536 64 56 0 26232 0 8192 2816 192 6 11206 0 Tabla 1-c Nótese que la tabla 1-a representa el peso (en decimal) de cada posición (columna) para cada base. Por ejemplo, para la base 4 la tercer columna .representa un peso 16, siendo en base 10 la columna de las centenas. En la tabla 1-b se copiaron distintos números en distintas bases. Finalmente, la tabla 1-c muestra los números de la tabla 1-b convertidos a base decimal (columna suma b10) para lo cual se multiplicó cada digito por su correspondiente peso y luego se sumaron los resultados parciales (por filas) a fin de obtener el número decimal equivalente a cada caso. Obsérvese que el desarrollo anterior se obtiene a partir de aplicar la regla de la representación de un número en un sistema posicional. A continuación, se presenta el mismo desarrollo pero utilizando parte fraccionaria: Base 4 3 2 10 10000 1000 100 2 16 8 4 256 64 8 4096 512 16 65536 4096 Número 28,56 b10 10101,0011 b2 30321,123 b4 63170,0007 b8 2BC6,BACAb 16 1 10 0 -1 -2 -3 -4 1 0,100 0,010 0,001 0,00010 00 4 2 1 0,500 0,250 0,125 0,06250 00 16 4 1 0,250 0,063 0,016 0,00390 63 64 8 1 0,125 0,016 0,002 0,00024 41 256 16 1 0,063 0,004 0,000 0,00001 53 n Tabla 2- base a 1 0 1 2 0 8 1 5 0 6 0 1 1 3 6 0 3 3 1 2 7 1 0 1 0 2 0 3 0 7 2 11 12 6 11 10 12 10 Tabla 2b Número 28,56 b10 0 0 0 20 10101,0011 16 0 4 0 b2 30321,123 b4 768 0 48 8 63170,0007 24576 1536 64 56 b8 2BC6,BACA 0 8192 2816 192 b16 8 0,500 0,060 0,000 1 0,000 0,000 0,125 1 0,250 0,125 0,047 0 0,000 0,000 0,000 6 0,688 0,039 0,003 Suma b10 0,0000 28,560 0,0625 21,188 0,0000 825,422 0,0017 26232,00 2 0,0002 11206,73 0 Tabla 2c 2.3 Sistemas de numeración usuales en informática 2.3.1 Hexadecimal: se compone de 16 dígitos, siendo estos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F Para pasar una cifra expresada en hexadecimal a decimal hay que aplicarle la fórmula de ponderación, como se ve en el ejemplo siguiente: (1AC05.B)16 a decimal: 1*164 + 10*163 + 12*162 + 0*161 + 5*160 + 11*16-1 = (109573.69)10 2.3.2 Octal: se compone de 8 dígitos, siendo estos: 0, 1, 2, 3, 4, 5, 6, 7 (753)8 a decimal: 7*82 + 5*81 + 3*80 = (491)10 2.3.3 Binario: Es el sistema de numeración con que operan internamente las computadoras digitales. Se compone de 2 dígitos, siendo estos: 0, 1. A cada dígito se lo denomina bit. (101.01)2 a decimal: 1*22 + 0*21 + 1*20 + 0*2-1 + 1*2-2 = (5.25)10 Decimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Binario 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Octal 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 Hexadecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F Tabla de equivalencias de cifras entre sistemas 2.4 Transformaciones entre sistemas de numeración 2.4.1 Decimal a binario Por divisiones sucesivas del número decimal entre 2. El último cociente es el bit de más a la izquierda y los demás bits son los sucesivos restos hallados, desde el último hasta llegar al primer resto, que es el bit de más a la derecha. (108)10 -> ( x )2 108 / 2 0 54 / 2 0 27 / 2 1 13 / 2 1 6/2 0 3/2 1 1 Se arma la cifra resultado con el resultado de la última división y los restos desde abajo hacia arriba ( 1101100 )2 2.4.2 Binario a octal Agrupar los bits en grupos de tres cifras binarias a partir del punto decimal a la derecha y a la izquierda. Cada grupo se convierte en su correspondiente cifra octal. ( 1101100 )2 -> ( x )8 1 5 4 1 101 100 -> ( 154 )8 2.4.3 Octal a binario Convertir individualmente cada cifra octal a tres bits. ( 623 )8 -> ( x )2 6 110 2 010 3 011 -> ( 110010011 )2 2.4.4 Binario a hexadecimal Agrupar los bits en grupos de cuatro cifras binarias a partir del punto decimal a la derecha y a la izquierda. Cada grupo se convierte en su correspondiente cifra hexadecimal. ( 111011001 )2 -> ( x )16 1 D 9 0001 1101 1001 -> ( 1D9 )16 2.4.5 Hexadecimal a binario Convertir individualmente cada cifra hexadecimal a cuatro bits. ( BACA )16 -> ( x )2 B A C A 1011 1010 1100 1010 -> ( 1011101011001010 )2 2.5 Operaciones aritméticas en el sistema binario Las operaciones aritméticas básicas en el sistema binario son las uma, la resta, el producto y la división: Suma aritmética 0+0 0+1 1+0 1+1 =0 =1 =1 = 0 y me "llevo" 1, dado que 1 + 1 = 10 Resta aritmética 0-0 0-1 1-0 1-1 =0 = 1 y "debo" 1 =1 =0 Producto aritmético 0*0 0*1 1*0 1*1 =0 =0 =0 =1 División aritmética Ejemplos En binario En decimal 00011 +01101 --------10000 3 + 13 ---16 En binario En decimal 111 +111 111 7 111 --------11100 + 7 ---28 En binario - 0111 0011 7 7 En decimal - 7 3 --------0100 ---4 En binario 1101 0010 --------1011 En decimal 13 2 ---11 En binario 0110 * 0111 --------0110 0110 0110 0000 ------------------0101010 En decimal * 6 7 ---42 2.6 Operaciones lógicas en el sistema binario Un dígito binario además de representar una cifra en base dos, también puede interpretarse como un valor booleano (dato lógico) que solo admite uno de dos valores de verdad: verdadero/falso o +/- o si/no o 1/0. Tal característica se utiliza a los efectos de modelar el comportamiento interno de una computadora digital. Así, además de realizar operaciones aritméticas es posible hacer operaciones lógicas sobre cifras booleanas. Las operaciones se realizan a nivel de bit y pueden ser 1 o 2 operandos. El cero corresponde al valor de verdad falso y el 1 al verdadero. Operador NOT X NOT (X) 0 1 1 0 X 0 0 1 1 Operador AND Y X AND Y 0 0 1 0 0 0 1 1 X 0 0 1 1 Operador OR Y X OR Y 0 0 1 1 0 1 1 1 X 0 0 1 1 Operador XOR Y X XOR Y 0 0 1 1 0 1 1 0 Ahora se presenta una aplicación de las operaciones lógicas: Sean I y J dos variables numéricas enteras, cuyos valores son 6 y 12 respectivamente, se indica el valor de verdad de los siguientes predicados. a) 2 * I <= J Verdadero b) 2*I<1 Falso c) I > 0 AND I < 10 (1 AND 1) Verdadero d) I > 25 OR (I < 50 AND J < 50) (0 OR (1 AND 1)) (0 OR 1) Verdadero e I < 4 XOR J > 5 0 XOR 1 Verdadero f) NOT (I > 6) Verdadero g) NOT (J > 6) Falso Las funciones lógicas trabajan sólo con operandos de un solo bit, como las computadoras utilizan grupos de 8, 16 ó 32 bits, se necesita extender la definición de éstas funciones para trabajar con más de dos bits. Las funciones lógicas en los procesadores actuales operan en una base de bit por bit (en inglés bitwise). Dados dos valores en determinada posición, las funciones producen el resultado de la respectiva posición, por ejemplo, para calcular la operación lógica AND en los siguientes dos números (de ocho bits) se debe ejecutar la operación lógica AND en cada columna, independientemente de las demás: AND 1011 0101 1110 1110 --------1010 0100 Ésta forma de ejecutar bit por bit (bitwise) puede fácilmente ser aplicada a otras operaciones lógicas como ser OR y XOR. Ejemplos OR 0110 1010 ---1110 XOR 0110 1010 ---1100 2.7 La información y su representación Los datos son conjuntos de símbolos utilizados para expresar o representar un valor numérico, un hecho, un objeto o una idea en la forma adecuada para ser tratado. Un dato es cualquier objeto manipulable por la computadora. Los datos pueden ser: Adquiridos directamente por la computadora, como sería, por ejemplo, la detección electrónica de temperatura o de una presión excesiva. Aportados por el usuario en forma de caracteres, es decir con letras, números, caracteres especiales (símbolos ortográficos, aritméticos y otros). La codificación es una operación de transformación que representa los elementos de un conjunto mediante los de otro, de forma que a cada elemento del primer conjunto le corresponde un único elemento del segundo. La información representada en un alfabeto de entrada debe ser transformada (codificada) a un alfabeto de salida que entienda el computador. La codificación debe realizarse de manera que a cada elemento del primer alfabeto le corresponda un elemento distinto del segundo. Información (alfabeto de entrada) Sistema de Codificación Información codificada (alfabeto de salida) Todo sistema de codificación lleva consigo un código que se define como la ley de correspondencia biunívoca entre los datos que se van a representar y su codificación. Humanos ASCII A 65 M 77 N 78 8 56 = 61 Algunas de las características de un código es el conjunto de caracteres y el número de bits que se utilizan para codificar un carácter (longitud del código). El número máximo del conjunto de carácteres que podemos representar es longitud. En el interior de la computadora la información se almacena y se transfiere de un lugar a otro en forma codificada. El código utilizado usa sólo dos valores (código binario) representados por 0 y 1. En la entrada y la salida de la computadora se efectúan automáticamente los cambios de códigos para que en el exterior la información sea directamente entendida por el usuario. La unidad más elemental de información en un ordenador es un valor binario, un cero o un uno, un bit. Un bit es una posición de memoria que toma el valor 0 o 1. Así pues, la mínima unidad de información en el interior de una computadora es el bit. La información se representa por medio de caracteres (letras mayúsculas y minúsculas, números, caracteres de puntuación y especiales). Pero la computadora sólo entiende secuencias binarias, así que dicha información debe codificarse internamente en notación binaria (en bits). Por lo tanto, a cada carácter le corresponderá cierto número de bits: una serie de bits distinta. Un byte es el mínimo número de bits necesarios para almacenar o representar un carácter en una memoria de computadora (es la menor cantidad de información direccionable sobre una memoria). Un byte suele corresponder a 8 bits. La capacidad de almacenamiento de una computadora o de un soporte de información (disco rígido, CDROM, etc) se mide en bytes, pero suele utilizarse múltiplos: 1 kilobyte 1 megabyte 1 gigabyte 1 terabyte 1 KB 1 MB 1 GB 1 TB 210 Bytes 210 KBytes 210 MBytes 210 GBytes 1024 Bytes 1024 KBytes 1024 MBytes 1024 GBytes 1024 bytes 1.048.576 bytes 1.073.741.824 bytes 1.099.511.627.776 bytes La información que se brinda a la computadora es en la forma normal que usan los seres humanos, es decir, con la ayuda de un alfabeto o conjunto de símbolos (caracteres). Los caracteres de texto son los siguientes: a) Alfanuméricos: a.1) Alfabéticos: A B C ...Y Z a b c ... y z a.2) Numéricos: 0 1 2 3 4 5 6 7 8 9 b) Especiales (ortográficos, aritméticos y otros) ( ) , * / ; : + Ñ ñ = ! ? . » “ & > # < [ Ç ç ] sp Para representar cualquier carácter (alfabético, numérico o especial) en el interior de una computadora es necesario un sistema de codificación como el ASCII, ANSI o UNICODE. Tales alfabetos asocian a cada carácter una determinada combinación de bits. 2.7.1 El código EBCDIC El código EBCDIC (Extender Binary Coded Decimal Interchange Code) es otro de los códigos más utilizados. Cada carácter se representa con un número de 8 bits. Este código fue inicialmente desarrollado por IBM para usar en sus computadoras, pero luego lo adoptaron otros fabricantes. 2.7.2 El código ASCII El código ASCII (American Standard Code for Information Interchange), fue establecido por el Instituto Nacional Americano de Estándares (ANSI) y es el sistema de codificación más difundido para PCs y comunicación de datos. En ASCII, la B y el 3 se representan digitalmente en la computadora como 1000010 y 0110011, respectivamente. Es un código de 7 bits que permite codificar 2^7 = 128 caracteres y aunque los idiomas tienen mucho menos de 128 caracteres imprimibles, se necesitan configuraciones adicionales de bits para representar una gran variedad de caracteres especiales, algunos muy comunes y otros no tanto y para indicarle a la computadora una gran variedad de actividades como hacer sonar un timbre o pedirle que acepte un dato (enter). Esta necesidad ha hecho que se utilice un código ASCII ampliado de 8 bits, para permitir codificar 2^8 = 256 caracteres. Existen varios caracteres del código ASCII, llamados caracteres de control, que tienen significados especiales. Se usan para transmisiones de datos en serie de una máquina a otra e indican cosas como fin de línea, avance de carro, etc. Oct Dec 0 0 01 1 02 2 03 3 04 4 05 5 06 6 07 7 010 8 011 9 012 10 013 11 014 12 015 13 016 14 017 15 020 16 021 17 022 18 023 19 024 20 025 21 026 22 027 23 030 24 031 25 032 26 033 27 034 28 035 29 Hex Caracter 0x00 NUL \0 0x01 SOH 0x02 STX 0x03 ETX 0x04 EOT 0x05 ENQ 0x06 ACK 0x07 BEL 0x08 BS \b 0x09 HT \t 0x0A LF \n 0x0B VT 0x0C FF \f 0x0D CR \r 0x0E SO 0x0F SI 0x10 DLE 0x11 DC1 0x12 DC2 0x13 DC3 0x14 DC4 0x15 NAK 0x16 SYN 0x17 ETB 0x18 CAN 0x19 EM 0x1A SUB 0x1B ESC 0x1C FS 0x1D GS Oct Dec 0100 64 0101 65 0102 66 0103 67 0104 68 0105 69 0106 70 0107 71 0110 72 0111 73 0112 74 0113 75 0114 76 0115 77 0116 78 0117 79 0120 80 0121 81 0122 82 0123 83 0124 84 0125 85 0126 86 0127 87 0130 88 0131 89 0132 90 0133 91 0134 92 0135 93 Hex Caracter 0x40 @ 0x41 A 0x42 B 0x43 C 0x44 D 0x45 E 0x46 F 0x47 G 0x48 H 0x49 I 0x4A J 0x4B K 0x4C L 0x4D M 0x4E N 0x4F O 0x50 P 0x51 Q 0x52 R 0x53 S 0x54 T 0x55 U 0x56 V 0x57 W 0x58 X 0x59 Y 0x5A Z 0x5B [ 0x5C \ 0x5D ] 036 037 040 041 042 043 044 045 046 047 050 051 052 053 054 055 056 057 060 061 062 063 064 065 066 067 070 071 072 073 074 075 076 077 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 0x1E 0x1F 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B 0x3C 0x3D 0x3E 0x3F RS US SPACE ! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 0136 0137 0140 0141 0142 0143 0144 0145 0146 0147 0150 0151 0152 0153 0154 0155 0156 0157 0160 0161 0162 0163 0164 0165 0166 0167 0170 0171 0172 0173 0174 0175 0176 0177 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 0x5E 0x5F 0x60 0x61 0x62 0x63 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B 0x7C 0x7D 0x7E 0x7F ^ _ ` 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 { | } ~ DEL En una cadena de caracteres cada carácter ocupa 1 byte y se representa según el código de caracteres que se esté utilizando. La cadena de caracteres de 4 bytes 48 4E 4C 41 representa, según la tabla de códigos ASCII, a la cadena "HOLA." 2.7.1 El código ANSI Microsoft Windows usa el sistema de codificación ANSI de 8 bit, norma desarrollada por el Instituto Nacional de Estándares de Estados Unidos y que permite compartir texto entre aplicaciones de Windows. Al igual que el ASCII ampliado, las primeras 128 combinaciones de ANSI son iguales a las del ASCII, pero las 128 siguientes están definidos para satisfacer las necesidades de las aplicaciones Windows. 2.7.1 El Unicode: 65.536 posibilidades Patrocinada por IBM, Microsoft y Sun Microsystems, se desarrolló Unicode, un sistema de codificación uniforme de 16 bits (2 bytes = 2 16 = 65.536 caracteres). Este sistema permite comunicarse computadoras y aplicaciones entre sí con mayor facilidad y se adapta a la mayoría de los idiomas de todo el mundo. 2.7.3.1 Reglas de orden de caracteres ASCII 1. Los caracteres correspondientes a dígitos numéricos están en su orden natural: "0"<"1"<"2"<"3"<"4"<"5"<"6"<"7"<"8"<"9" 2. Las letras mayúsculas continúan el orden alfabético: "A"<"B"<"C"<"D"<, . . . . . .,<"Z" 3. Luego continúan las letras minúsculas, pero sus códigos son mayores que las letras mayúsculas, por lo tanto se ordenan antes. "a"<"b"<"c"<"d"<, . . . . . .,<"z" y 4. El resto de los caracteres. "a">"M">"C">"B"