UNIDADES DE MEDIDA EMPLEADAS EN INFORMATICA. Las unidades de medida en Informática a veces pueden resultar algo confusas. Vamos a tratar de aclarar algunos conceptos viendo a que se refieren. Podemos agrupar estas medidas en tres grupos: Almacenamiento, procesamiento y transmisión de datos. ALMACENAMIENTO: Con estas unidades medimos la capacidad de guardar información de un elemento de nuestro PC. Los medios de almacenamiento pueden ser muy diferentes (ver tutorial sobre Medios de almacenamiento.). Precisamente es en este tipo de medidas donde se puede crear una mayor confusión. La unidad básica en Informática es el bit. Un bit o Binary Digit es un dígito en sistema binario (0 o 1) con el que se forma toda la información. Evidentemente esta unidad es demasiado pequeña para poder contener una información diferente a una dualidad (abierto/cerrado, si/no), por lo que se emplea un conjunto de bits (en español el plural de bit NO es bites, sino bits). Para poder almacenar una información más detallado se emplea como unidad básica el byte u octeto, que es un conjunto de 8 bits. Con esto podemos representar hasta un total de 256 combinaciones diferentes por cada byte. Aquí hay que especificar un punto. Hay una diferencia entre octeto y byte. Mientras que un octeto tiene siempre 8 bits un byte no siempre es así, y si bien normalmente si que tiene 8 bits, puede tener entre 6 y 9 bits. Precisamente el estar basado en octetos y no en el sistema internacional de medidas hace que las subsiguientes medidas no tengan un escalonamiento basado el este sistema (el SI o sistema internacional de medidas). Veamos los más utilizados: byte.- Formado normalmente por un octeto (8 bits), aunque pueden ser entre 6 y 9 bits. La progresión de esta medida es del tipo B=Ax2, siendo esta del tipo 8, 16, 32, 64, 128, 256, 512. Se pueden usar capacidades intermedias, pero siempre basadas en esta progresión y siendo mezcla de ellas (24 bytes=16+8). Kilobyte (K o KB).- Aunque se utilizan las acepciones utilizadas en el SI, un Kilobyte no son 1.000 bytes. Debido a lo anteriormente expuesto, un KB (Kilobyte) son 1.024 bytes. Debido al mal uso de este prefijo (Kilo, proveniente del griego, que significa mil), se está utilizando cada vez más el término definido por el IEC (Comisión Internacional de Electrónica) Kibi o KiB para designar esta unidad. Megabyte (MB).- El MB es la unidad de capacidad más utilizada en Informática. Un MB NO son 1.000 KB, sino 1.024 KB, por lo que un MB son 1.048.576 bytes. Al igual que ocurre con el KB, dado el mal uso del término, cada vez se está empleando más el término MiB. Gigabyte (GB).- Un GB son 1.024 MB (o MiB), por lo tanto 1.048.576 KB. Cada vez se emplea más el término Gibibyte o GiB. Llegados a este punto en el que las diferencias si que son grandes, hay que tener muy en cuenta (sobre todo en las capacidades de los discos duros) que es lo que realmente estamos comprando. Algunos fabricantes utilizan el termino GB refiriéndose no a 1.024 MB, sino a 1.000 MB (SI), lo que representa una pérdida de capacidad en la compra. Otros fabricantes si que están ya utilizando el término GiB. Para que nos hagamos un poco la idea de la diferencia entre ambos, un disco duro de 250 GB (SI) en realidad tiene 232.50 GiB. Terabyte (TB).- Aunque es aun una medida poco utilizada, pronto nos tendremos que acostumbrar a ella, ya que por poner un ejemplo la capacidad de los discos duros ya se está aproximando a esta medida. Un Terabyte son 1.024 GB. Aunque poco utilizada aun, al igual que en los casos anteriores se está empezando a utilizar la acepción Tebibyte Existen unas medidas superiores, como el Petabyte, Exabyte, Zettabyte o el Yottabite, que podemos calcular multiplicando por 1.024 la medida anterior. Estas medidas muy probablemente no lleguen a utilizarse con estos nombre, sino por los nuevos designados por el IEC.
En el círculo, indicación de la capacidad del disco, tanto en GB como en bytes. PROCESAMIENTO FRECUENCIA DE TRANSMISION: La velocidad de procesamiento de un procesador se mide en megahercios. Un megahercio es igual a un millón de hercios. Un hercio (o herzio o herz) es una unidad de frecuencia que equivale a un ciclo o repetición de un evento por segundo. Esto, en palabras simples, significa que un procesador que trabaje a una velocidad de 500 megahercios es capaz de repetir 500 millones de ciclos por segundo. En la actualidad, dada la gran velocidad de los procesadores, la unidad más frecuente es el gigahercio, que corresponde a 1.000 millones de hercios por segundo. Sobre esto hay que aclarar un concepto. Si bien en teoría a mayor frecuencia de reloj (más megahercios) su supone una mayor velocidad de procesamiento, eso es solo cierto a medias, ya que en la velocidad de un equipo no solo depende de la capacidad de procesamiento del procesador. Estas unidades de medida se utilizan también para medir la frecuencia de comunicación entre los diferentes elementos del ordenador.
En la imagen, dentro del círculo, frecuencia del procesador, expresada en GHz. VELOCIDAD TRANSMISION DE DATOS: En el caso de definir las velocidades de transmisión se suele usar como base el bit, y más
concretamente el bit por segundo, o bps Los múltiplos de estos si que utilizan el SI o Sistema Internacional de medidas. Los más utilizados sin el Kilobit, Megabit y Gigabit, siempre expresado en el término por segundo (ps). Las abreviaturas se diferencian de los términos de almacenamiento en que se expresan con b minúscula. Estas abreviaturas son: Kbps.- = 1.000 bits por segundo. Mbps.- = 1.000 Kbits por segundo. Gbps.- = 1.000 Mbits por segundo. En este sentido hay que tener en cuenta que las velocidades que en la mayoría de las ocasiones se muestran en Internet están expresadas en KB/s (Kilobyte por segundo), lo que realmente supone que nos dice la cantidad de bytes (unidad de almacenamiento) que hemos recibido en un segundo, NO la velocidad de trasmisión. Podemos calcular esa velocidad de transmisión (para pasarla a Kbps o Kilobits por segundo) simplemente multiplicando el dato que se nos muestra por 8, por lo que una trasmisión que se nos indica como de 308 KB/s corresponde a una velocidad de transmisión de 2.464 Kbps, a lo que es lo mismo, 2.64 Mbps. Esta conversión nos es muy útil para comprobar la velocidad real de nuestra línea ADSL, por ejemplo, ya que la velocidad de esta si que se expresa en Kbps o en Mbps.
En esta imagen podemos ver la velocidad de transferencia, expresada en KB/s (Kilobytes por segundo). En la imagen superior podemos ver un ejemplo de lo anteriormente comentado. Se muestra una velocidad de transferencia de 331 KB/s, lo que corresponde (multiplicando este dato por 8) a una velocidad de transmisión de 2.648 Kbps, o lo que es lo mismo, 2.65 Mbps (Megabits por segundo).
OPERADORES: Definición de operador.
Taxonomía por número de operandos: operadores unarios y binarios. Taxonomía por tipo de operandos Operadores Aritméticos, Lógicos Relacionales. El operador de asignación. Expresiones - concepto de prioridad de operadores.
Definición de operador. De poco serviría almacenar información en variables si no fuera posible procesar esa información. El procesamiento, claro está, consiste en ejecutar instrucciones propias del procesador. En un lenguaje de alto nivel, las instrucciones se denotan mediante operadores (+, -, * etc.); de hecho, los operadores de un lenguaje de alto nivel se utilizan formando
y
expresiones. Una expresión, en un lenguaje de alto nivel, es muy parecida a una expresión matemática: float largo = 2.0; float ancho = 3.0; float superficie; superficie = largo * ancho; /* Aquí hay dos expresiones */ Una expresión es una combinación de variables y operadores que define de forma no ambigua el resultado que se pretende calcular (esto es, se trata de una indicación que dice al compilador qué colección de instrucciones debe generar para que, al ser ejecutadas, calculen el resultado buscado por la expresión). Las expresiones, traducidas por el compilador, y ejecutadas por el procesador, producen resultados que luego se almacenará en variables. Las informaciones que sirven como datos para la operación reciben el nombre de operandos. En el ejemplo anterior, los operandos del operador multiplicación (*) eran las variables largo y ancho. Por otra parte, el resultado de la expresión largo*ancho servía como operando para el operador de asignación (=). Como nota adicional, conviene indicar que los operadores de los lenguajes de programación están definidos dentro del propio lenguaje; esto es, no es preciso definir su comportamiento. En algunos lenguajes, notablemente en C++, es posible redefinir el comportamiento de los operadores, de modo que éste se adapte a nuevos tipos. Esto hace posible, por ejemplo, redefinir (sobrecargar , en la jerga local) el operador + para que, al darle como operandos dos matrices adecuadas, produzca como resultado la matriz suma de ambas. Taxonomía por número de operandos: operadores unarios y binarios. Una posible forma de clasificar los operadores es la que atiende al número de operandos que iten. Los operadores unarios iten un único argumento, y entre ellos se cuenta el operador de cambio de signo (-) y los operadores de incremento y decremento (++ y --). Los operadores binarios, que son los más comunes, se caracterizan por itir dos operandos, y entre ellos se cuentan los operadores aritméticos habituales (+, -, *, /). El uso de operadores puede asemejarse a las llamadas a funciones; se ve entonces la posibilidad de que existan operadores ternarios, cuaternarios etc. dependiendo del número de argumentos que ita la función. Este hecho resulta de especial interés en C++. Taxonomía por tipo de operandos: operadores Aritméticos, Lógicos y Relacionales. Operador de Asignación. Otra posible clasificación de los operadores es la debida al tipo de argumentos que iten. Según este esquema de clasificación, podremos hablar de varios tipos de operadores:
Operadores aritméticos Operadores lógicos Operadores de comparación e igualdad Operadores de bits y de desplazamiento Operador de asignación
Operadores aritméticos
Nombre
Símbolo
Multiplicación
*
Esta tabla muestra los símbolos de los operadores aritméticos, junto con su cometido. Estos operadores permiten escribir expresiones cuya evaluación es precisamente el tratamiento de información que efectúa el ordenador. Los operadores División / aritméticos, junto con una amplia gama de funciones Módulo % residentes en la biblioteca del lenguaje empleado, hacen posible realizar cálculos de todo tipo. La flexibilidad de los Suma + lenguajes de programación a efectos de cálculo queda patente en la conocida referencia "Numerical Recipes" . Como Resta curiosidad, el lector podría acceder a un buscador de Internet y solicitar información empleando como clave las palabras "Numerical Methods".
Operadores lógicos Nombre
Símbolo
Sirven para calcular el valor de expresiones lógicas, esto es, de expresiones en que los únicos valores que Conjunción lógica && pueden tomar los operandos son Verdadero o Falso. (AND) Existen dos versiones de estos operadores. Cuando se desea simplemente saber si una expresión es Disyunción lógica || verdadera o falsa (por ejemplo, x>7), se emplean (OR) operadoreslógicos. Estos operadores no consideran Negación lógica (NOT) ! la estructura de bits, limitándose a tomar el valor 0 como falso y cualquier otro como verdadero. Existe también otra versión (los operadores de bits) que imponen las operaciones lógicas a los bits empleados para representar internamente a los operandos. Se trata de los operadores &, | y ~, respectivamente.
Operadores relacionales Nombre
Símbolo
El concepto de comparación implica ciertamente distintos significados en función del tipo de datos de las variables menor < comparadas. Los operadores presentados en esta tabla son adecuados para comparar valores numéricos u ordinales menor o igual <= (caracteres individuales o valores enumerados), pero no para mayor > comparar cadenas o listas de cualquier tipo. La comparación de cadenas exige utilizar funciones creadas específicamente mayor o igual >= con este fin, como strcmp(). Véase aquí una descripción de las funciones de comparación de cadenas que ofrece C. distinto != Téngase en cuenta también que estas funciones no tratan correctamente los signos diacríticos; será preciso recurrir a igual == otros métodos para comparar correctamente cadenas en idiomas que los contengan.
Operadores de bits y de desplazamiento
Nombre
Símbolo
Una computadora es un dispositivo lógico programable, según se ha & indicado. Por tanto, ofrece herramientas adecuadas para la manipulación de bits, que son a fin Disyunción | de cuentas el método de (OR) representación de su información. Negación o complemento a unos (NOT) ~ En este sentido, existen operadores que aplican las leyes lógicas Desplazamiento a la izquierda habituales (AND, OR, NOT, etc.) a las << (Multiplicación por 2) representaciones internas de sus operandos. Esto hace posible crear Desplazamiento a la derecha >> máscaras adecuadas para extraer (División por 2) información relativa a fragmentos concretos de la representación interna de esos operandos. Por otra parte, existen métodos sumamente rápidos para realizar operaciones de multiplicación o división por dos. Si todos los bits de un número escrito en binario se desplazan hacia la izquierda una posición, el resultado equivale a multiplicar por 2; si el desplazamiento es de una posición a la derecha, esto equivale a dividir por 2. Los operadores de desplazamiento permiten realizar, precisamente, este tipo de operaciones. Conjunción (AND)
El operador de asignación La asignación es una operación consistente en calcular el valor de una expresión y copiar ese valor en algún lugar, que se indicará en la propia expresión de asignación. Las sentencias de asignación son de la forma destino operador_de_asignación expresión y un ejemplo podría ser x=7 En una sentencia de asignación, destino especifica la zona de memoria que recibirá el valor y expresiónes cualquier expresión válida en el lenguaje considerado. El mecanismo de funcionamiento de las sentencias de asignación tiene tres paso:
Evaluación de la expresión (que se denomina rvalue). Evaluación de la dirección del segmento de memoria de destino (que se denomina lvalue). Copia del valor de la expresión en el segmento de memoria de destino.
Las sentencias de asignación son terreno abonado para incurrir en errores relacionados con la compatibilidad de tipos. Es muy sencillo, por ejemplo, intentar asignar el valor de una cadena a un entero, o viceversa. Este tipo de errores será detectado por el compilador, pero existen errores más sutiles, que no se detectan en el proceso de compilación. Tal sería el caso, por ejemplo, de posibles errores lógicos debidos a una refundición de tipos sin sentido. ADVERTENCIA.- Es frecuente que los lenguajes de programación ofrezcan un operador de comparación de igualdad cuyo símbolo sea similar al símbolo del operador de asignación. En el caso de C, el operador de comparación de igualdad son dos signos de igual seguidos ("=="), y el operador de asignación es un solo signo de igual ("="). Su confusión suele ser indetectable por parte del compilador, y dará lugar a resultados inexplicables e incorrectos. ¡No los confunda! Expresiones. Concepto de prioridad de operadores. Una expresión, como se ha indicado, es una combinación de operadores y operandos. En particular, cualquier variable individual es una expresión: el valor de esa expresión,
claro está, será el valor de la variable. Todos los operadores poseen una "sintaxis", esto es, un cierto orden en el que deben escribirse los operandos y el símbolo del operador. Por ejemplo, para denotar la suma de dos números lo normal es escribir a + b En este caso, la sintaxis del operador exige escribir primero un operando, después el símbolo del operador, y por último el segundo operando. Evidentemente, esta expresión produciría un resultado, pero ese resultado se perdería al no haber sido asignado a una variable. Consiguientemente, es frecuente encontrar expresiones de la forma c = a + b en que aparecen dos operadores: el de asignación ("=") y el de adición ("+"). Evidentemente, se pueden crear expresiones mucho más complejas, en las que aparecerá un elevado número de operandos y operadores; de hecho lo normal es que se utilice el resultado de ciertas expresiones como operando para otras. Considérese por ejemplo d = (a + b) / c Esta expresión contiene una subexpresión, (a + b), que será preciso evaluar antes de efectuar la división, para por último realizar la asignación. Se observa que el orden de evaluación de expresiones es totalmente crucial para obtener un resultado correcto. Será preciso entonces indicar al compilador lo que debe hacer. Considérese la expresión d = a + b / c El compilador va a interpretarla en la forma d = a + (b/c), que probablemente no sea lo que deseaba el . Sin embargo, la expresión anterior, d= (a + b) / c, se evaluará correctamente, porque el compilador entiende que las expresiones encerradas entre paréntesis tienen prioridad con respecto a las que no están encerradas entre paréntesis (deben evaluarse antes). Cuando dos expresiones están igualmente rodeadas por paréntesis, como en el caso d = (a + b) / (c + f) el compilador efectúa la evaluación de izquierda a derecha. Existen algunas reglas más, que será preciso estudiar para cada lenguaje de programación. Sin embargo, basta emplear las reglas matemáticas habituales (y los paréntesis correspondientes) para estar seguro de que el compilador interpretará las expresiones tal como desea el . En ausencia de paréntesis, se siguen unas reglas (propias de cada lenguaje) que indican cuales son los operadores (y por tanto las expresiones) que se evaluarán en primer lugar. La tabla de prioridades de los operadores del lenguaje C, mostrados desde la prioridad más alta hasta la más baja, es como sigue:
Operadores
Comentarios
() [] -> .
Las expresiones más anidadas construidas operadores son las de mayor prioridad.
con
estos
! ~ ++ -- - (tipo) Todos estos operadores son unarios. * & sizeof , * / %
Multiplicación, división y módulo.
+ -
Suma y resta.
<< >>
Operadores de desplazamiento de bits.
< <= > >=
Operadores de comparación numérica.
== !=
Operadores de comparación de igualdad y desigualdad.
&
Conjunción lógica bit a bit (AND).
^
Disyunción lógica excluyente bit a bit (XOR).
|
Disyunción lógica bit a bit (OR).
&&
Conjunción lógica.
||
Disyunción lógica.
?:
Operador condicional.
= *= /= %= += -= Operadores de asignación; son los de menor prioridad,para asegurar que la expresión esté completamente evaluada antes <<= >>= &= ^= |= de almacenar su resultado.
Representación de un número entero Un número entero es un número completo que puede ser negativo. Por lo tanto, el número se debe codificar de manera que se pueda distinguir si es positivo o negativo y de forma que siga las reglas de adición. El truco consiste en utilizar un método denominado complemento doble.
Un número entero o cero se representará en base binaria (base 2) como un número natural, con la excepción de que el bit de mayor peso (aquel que se encuentra más a la izquierda) representa el signo más o menos. Por lo tanto, para un número entero o cero, este bit se debe establecer en 0 (lo que corresponde al signo más, así como 1 es el signo menos). De este modo, si un número natural se codifica utilizando 4 bits, el mayor número posible será 0111 (o 7 en base decimal). Generalmente, el mayor número entero posible codificado utilizando n bits será2n-1-1.
Un número entero negativo se codifica utilizando complementos dobles. El principio de los complementos dobles: Se elige un número negativo.
Se toma su valor absoluto (su equivalente positivo)
Se representa en base binaria utilizando n-1 bits
Cada bit se cambia con su complemento (es decir, los ceros se reemplazan con unos y viceversa)
Se suma 1 Nótese que al sumar un número y sus complementos dobles es resultado es 0 Veamos esto con un ejemplo:
Queremos codificar el valor 5 utilizando 8 bits. Para hacer esto:
escriba el 5 en sistema binario 00000101
cámbielo por su complemento 11111010
sume 1: 11111011
la representación binaria en 8 bits de 5 es 11111011 Comentarios: El bit de mayor peso es 1, de manera que es, de hecho, un número negativo. Si sumamos 5 y -5 (00000101 y 11111011) la suma da 0 (con el remanente 1).
Representación de un número real El objetivo es representar un número con un punto decimal en sistema binario (por ejemplo, 101.01, que no se lee ciento uno punto cero uno ya que es, de hecho, un número binario, 5,25 en sistema decimal) mediante el formato 1.XXXXX... * 2n (en nuestro ejemplo, 1.0101*22). El estándar IEEE 754 define cómo codificar un número real. Este estándar ofrece una forma de codificar un número utilizando 32 bits, y define tres componentes:
el signo más/menos se representa por un bit: el bit de mayor peso (aquel que se encuentra más a la izquierda)
el exponente se codifica utilizando 8 bits inmediatamente después del signo
la mantisa (los bits después del punto decimal) con los 23 bits restantes Así, la codificación sigue la forma: seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm
la s representa al bit del signo. cada e representa al exponente del bit cada m representa a la mantisa del bit
Sin embargo, hay ciertas restricciones para los exponentes:
el exponente 00000000 está prohibido el exponente 11111111 está prohibido. Sin embargo, a veces se utiliza para informar de errores. Esta configuración numérica se denomina NaN (Not a number), que significa No es un número.
Se le debe sumar 127 (01111111) al exponente para convertir al decimal en un número real dentro del sistema binario. Por lo tanto, los exponentes pueden variar de -254 a 255
Así, la fórmula para expresar números reales es: (-1)^S * 2^( E - 127 ) * ( 1 + F )
donde:
S es el bit del signo y, por lo tanto, 0 se entiende como positivo ( -1^0=1 ).
E es el exponente al que se le debe sumar 127 para obtener el equivalente codificado
F es la parte de la fracción, la única que se expresa, y la que se le suma a 1 para realizar el cálculo.
Aquí hay un ejemplo: Se codificará el valor 525,5.
525,5 es positivo, por lo que el primer bit será 0. Su representación en el sistema binario (base 2) es: 1000001101.1 Al normalizarlo, obtenemos: 1.0000011011*2^9
Sumándole 127 al exponente, que es 9, da 136 o, en sistema binario (base 2): 10001000
La mantisa está compuesta por la parte decimal de 525,5 en base 2 normal, que es 0000011011.
Como la mantisa debe tomar 23 bits, se deben agregar ceros para completarla: 00000110110000000000000
La representación binaria de 525,5 bajo el estándar IEEE 754 es, por lo tanto: 0 1000 1000 00000110110000000000000 0100 0100 0000 0011 0110 0000 0000 0000 (4403600 en sistema hexadecimal)
A continuación hay otro ejemplo, esta vez utilizando un número real negativo : Se codificará el valor -0,625.
El bit s es 1, como 0,625 es negativo.
0,625 se escribe en sistema binario (base 2) de la siguiente manera: 0.101
Queremos escribirlo en la forma 1.01 x 2-1
Consecuentemente, el exponente vale 1111110 como 127 - 1 = 126 (o 1111110 en sistema binario)
La mantisa es 01000000000000000000000 (sólo se representan los dígitos después del punto decimal, ya que el número entero es siempre equivalente a 1)
La representación binaria de 0,625 bajo el estándar IEEE 754 es, por lo tanto: 1 1111 1110 01000000000000000000000 1111 1111 0010 0000 0000 0000 0000 0000 (FF 20 00 00 en sistema hexadecimal)
REPRESENTACIÓN DE NÚMEROS RACIONALES EN LA RECTA NUMÉRICA Recordemos que el conjunto de los números enteros se denota por Z y se define de la manera siguiente: Z = { ..., -3, -2, -1, 0, 1, 2, 3, ... } Ya sabemos representar los números enteros como puntos de una recta de la manera siguiente:
El segmento de recta comprendido entre dos números enteros consecutivos se llama "segmento unidad". De manera similar, recordemos que el conjunto de los números racionales se denota por Q y se define de la manera siguiente:
Recordemos además que si a ∈ Z (a representa un número entero), b ∈ Z, b > 0 (b es un número entero distinto de cero), el número racional a/b se puede considerar como el cociente que se obtiene al dividir a por b; en donde b indica el número de partes en que se divide la unidad y a el número de partes que se toman. De esta manera, si se divide en dos partes iguales cada segmento unidad en la recta numérica, podemos representar los números racionales cuya representación fraccionaria tiene como denominador 2, como se muestra en el ejemplo siguiente. EJEMPLO Represente en la recta numérica los siguientes números racionales: a. 3/2, b. 7/2, c. -1/2, d. -5/2 Solución: