sábado, 5 de abril de 2014

¿Cómo guarda el ordenador la información? (1)

En este artículo vamos a ver cómo un ordenador almacena la información que utiliza. Es importante para comprender qué son las variables en los lenguajes de programación.

Este tema es muy importante porque cuando una persona se inicia en el aprendizaje de la programación, al principio no entiende bien que significan las variables, la memoria que ocupan, el uso que se les da etc. Si este tema se entiende bien, tendremos mucho ganado a la hora de dar nuestros primeros pasos en la programación.

Toda la información que se almacena en un ordenador se debe guardar en última instancia, en código binario/lenguaje máquina, que es el único idioma que entiende el ordenador. Esto es así porque el ordenador almacena la información mediante pequeños biestables o componentes electrónicos que solo pueden adoptar dos posiciones: que tengan corriente o que no la tengan.
Un ordenador no puede guardar un carácter o letra como la B o un símbolo como el *. La memoria del ordenador, y ahí incluimos el resto de componentes internos que forman el pc, no comprende las letras ni los números, sólo entiende los impulsos de corriente eléctrica. Así, cuando un usuario quiere guardar una letra o cualquier información, mediante un procesador de textos por ejemplo, el sistema operativo y los componentes hardware del pc transforma la letra o el texto en un conjunto de impulsos eléctricos.
Las celdas de memoria del ordenador pueden adoptar dos posiciones:
1 Indica presencia de corriente eléctrica
0 No hay presencia de corriente eléctrica.
Así pues, tanto los datos con los que opera el ordenador como los programas que utiliza tienen que estar codificados en binario (con unos y ceros).

Con un ordenador podemos usar diferentes tipos de datos: datos numéricos, datos alfanuméricos, imágenes, vídeos, sonidos etc; todos estos datos tienen que convertirse, para ser almacenados y utilizados por el ordenador, a código binario. Dependiendo del tipo de dato que se quiera utilizar, el ordenador emplea un sistema de codificación diferente, que facilita el paso de la información a código binario

¿Cómo transforma un ordenador información numérica a código binario?
Cuando se trata de convertir códigos numéricos a binario, se utilizan las leyes matemáticas básicas de conversión entre sistemas de numeración. Se hace así porque, de esta forma, el ordenador puede utilizar las leyes de la aritmética matemática para operar con los valores numéricos (sumar, restar, multiplicar, dividir...). De hacer estas operaciones matemáticas básicas se encarga una parte del procesador que es la unidad aritmética/lógica (un procesador está compuesto por dos miembros: la unidad de control y la unidad aritmético/lógica. La primera se encarga de buscar, controlar y ejecutar las instrucciones de los programas mientras que la segunda hace operaciones aritméticas y lógicas).
Antes de ver el proceso de conversión de números a binario conviene saber un par de cosas:
Los sistemas de numeración que se utilizan en informática son normalmente el decimal, el octal y el hexadecimal. El primero porque es el que usamos normalmente para representar los números, los otros dos porque es muy fácil convertirlos a binario.
Primero de todo, ¿qué es un sistema de numeración?
Bueno, un sistema de numeración es un conjunto de símbolos y reglas que utilizamos para representar cantidades o datos numéricos. Tienen una base que es a la que referencian y que determina el número de símbolos diferentes que componen el sistema de numeración. Así, el sistema decimal tiene base 10 y está compuesto por los números del 0 al 9. El octal tiene de base el 8 y está compuesto por los números del 0 al 7 y el hexadecimal tiene de base el 16 pero a diferencia de los otros dos sistemas no está compuesto por los números del 0 al 15 sino por los números del 0 al 9 y las letras A,B,C,D,E y F, siendo la letra A el equivalente en decimal al 10, la letra B sería el 11 y así hasta el 15 que sería la F.

Todos los sistemas de numeración que se utilizan son sistemas posicionales, es decir, el valor relativo que cada símbolo representa viene determinado por su valor absoluto y la posición que este ocupa. Por ejemplo, el número 1050 en decimal está formado por los siguientes números:
1 * 103 + 0 * 102 + 5 * 101 + 0 * 100 = 1000 + 0 + 50 + 0 = 1050
o el 358: 3*102 + 5*101 + 8*100 = 300 + 50 + 8 = 358


Convertir un número decimal  a binario (o cualquier otra base)
Para convertir un número decimal a binario se puede hacer de dos maneras: mediante multiplicaciones y divisiones o mediante restas sucesivas.
El primer método consiste en hacer la división entera de la parte entera del número que queramos convertir a binario (o cualquier otra base) entre la base a la que lo queramos convertir. Luego cogemos como dividendo el cociente de la anterior división y seguimos haciendo este paso hasta que el resto sea menor que la base. El último cociente y todos los restos forman la parte entera del número decimal en la base a convertir. En este caso vamos a convertir el número 589 en decimal a binario:
Hacemos la división sucesiva entre dos:
Una vez hecha la división cogemos el último cociente y todos los restos desde el último al primero y el número quedaría así:
1001001101  que es la representación en binario del número 589 en decimal. Dicho número al tener 10 dígitos ocupa 10 bits en memoria (recordad que cada dígito binario es un bit de información)
Si queremos pasar un número en decimal con parte fraccionaria o decimales, separamos la parte entera del número y hacemos la división exactamente igual. Luego cogemos la parte decimal y la multiplicamos por la base hasta que el resultado sea cero o se repita, en cuyo caso significaría que el número es periódico. Como ejemplo, vamos a convertir en binario el número 589,25.
Primero convertimos la parte entera, que es la que hemos hecho arriba: 1001001101.
Ahora cogemos la parte decimal que sería 0,25 y la multiplicamos por 2 hasta que tengamos como resultado cero o se repita el resultado:
0,25 * 2 = 0,5  (Nos quedamos con la parte entera, en este caso es cero, y seguimos multiplicando la parte decimal) --> 0
0,5 * 2 = 1,0 --> 1 (Como la parte fraccionaria aquí es cero terminamos)
La parte fraccionaria del número es 01 por tanto el número completo en binario es 1001001101,01
Si en vez de pasar el número a binario lo queremos pasar a octal se hace lo mismo pero dividiendo la parte entera por 8 en vez de por 2 y multiplicando la parte fraccionaria también por 8.

A parte de este método existe el de restas sucesivas: 
Aquí lo que hay que hacer es buscar la potencia de la base más grande que se pueda restar al número que queremos convertir, luego tomamos como nuevo número el resultado de la resta y así hasta que el resultado sea cero o se repita. Para ver esto vamos a convertir a binario el número anterior 589 pero esta vez con las restas sucesivas:
Lo primero es averiguar que potencia de 2 podemos restarle primero:
Hacemos una tabla de potencias de 2:
Tenemos el número 589, en este caso, la potencia más grande de 2 que podemos restar es 512 que es 29.
Hacemos la resta:
589 - 512 = 77 (hemos restado 29)
Ahora seguimos restando el nuevo resultado por la mayor potencia de 2 posible:
77 - 64 = 13 (hemos restado 26)
13 - 8 = 5 (hemos restado 23)
5 - 4 = 1 (hemos restado 22)
1 - 1 = 0 (hemos restado 20)
Una vez hecho esto, ya podemos escribir el número en binario, poniendo un 1 en las posiciones donde hayamos restado una potencia de 2 y un cero en las que no:
posición             10  9  8  7  6  5  4  3  2  1  0
dígito en binario  0   1  0  0  1  0  0  1  1  0  1
¿Qué significa esa tabla?
Hemos restado el número por las potencias de 2 siguientes: 29, 26, 23, 22 y 20, por tanto, en esas posiciones ponemos un 1, en las demás un cero, así queda el siguiente número: 1001001101 que es exactamente el mismo que salió cuando lo convertimos por el método de división y multiplicación.

Convertir cualquier número en cualquier base a decimal
Para hacer esto, solamente tenemos que calcular el polinomio que consiste en multiplicar cada dígito del número por la base del sistema de numeración que tengamos elevado a su posición en el número.
Como ejemplo, vamos a convertir el número anterior en binario a decimal: 1001001101
Empezamos a contar desde el último dígito hasta el primero para ver las potencias, como son 10 dígitos, van del 0 al 9, como el número es binario, la base es 2 así pues queda el siguiente polinomio:
(1 * 29) + (0 * 28) + (0 * 27) + (1 * 26) + (0 * 25) + (0 * 24) + (1 * 23) + (1 * 22) + (0 * 21) + (1 * 20) nota: pongo paréntesis para que se vea más claro.
Si calculamos eso nos queda:
(1*512) + 0 + 0 + (1*64)+0+0+(1*8)+(1*4)+0+1
Haciendo la suma tenemos: 512 + 64 + 8 + 4 + 1 = 589
que es la representación en decimal del número 1001001101.
Si el número fuera en octal se haría lo mismo pero multiplicando por potencias de 8 en vez de dos y si fuera hexadecimal por potencias de 16 teniendo en cuenta que las letras A-F son los números del  10 al 15 en decimal.
En el próximo artículo, veremos cómo se realizan operaciones aritméticas con los números binarios y como se representan las cantidades negativas.

No hay comentarios:

Publicar un comentario