CONCEPTO DE TIPOS DE DATOS
¿Qué es un tipo de datos?
Un tipo de datos es una convención para la codificación de información. Estas convenciones,
q.v.
, son necesarias porque las computadoras solamente procesan información de formato binario; a fin de cuentas se trata de dispositivos que admiten pulsos de tensión muy baja (unos pocos voltios) y frecuencia muy alta (típicamente, centenares de megahercios o algunos gigahercios). Es importante tener en cuenta que a definición de un tipo de datos, esto es, la definición del modo en que se va a representar una información mediante colecciones de unos y ceros, especifica el conjunto de informaciones que se puede representar internamente en el ordenador. Sólo será posible procesar informaciones representables en el ordenador, y es infinito en modo alguno, sino que antes bien presenta ciertas limitaciones bastantes fáciles de alcanzar. Por ejemplo, téngase en cuenta que los seres humano manejan frecuentemente números "reales", con un número infinito de decimales, mientras que las computadoras están limitadas (por el número finitos de bits de que consta la representación empleada) a un número finito de decimales. De hecho, es perfectamente posible que un número representable con un número finito de decimales en base 10 requiera un número infinito de decimales para codificarlo en base 2. Y la inversa también es cierta: existen números con cifras decimales que requieren un número finito de decimales en base 2, pero un número infinito de decimales en base 10. En tales casos, se trunca la representación; el resultado es lo más fiel posible para la cantidad de bits disponible, pero es erróneo. Toda operación efectuada con ésa cifra aportará un error; si el número de operaciones es elevado, el resultado final puede llegar a tener un error tan grande que resulte inadmisible.
Tipos de datos numéricos y alfanuméricos
Vamos a crear una taxonomía de los tipos de datos, atendiendo en principio a si se trata de datos textuales o numéricos. Hablaremos por tanto de datos numéricos o alfanuméricos; los primeros se representan internamente mediante una codificación binaria del número "humano" equivalente; los segundos al estar formados por caracteres en lugar de dígitos, requieren un tratamiento diferente.
La representación interna de los datos numéricos pretende optimizar el alcance, precisión y rendimiento, pero es preciso emplear técnicas distintas:
-
Los números enteros (en el sentido matemático habitual) se representan en el ordenador mediante un cierto número de bits (32, por ejemplo). Por tanto, el tamaño máximo de los números enteros que se pueden representar (y procesar) no es infinito; llega, como máximo, a unos 4.000 millones... si estamos dispuestos a renunciar a los números negativos. Si no es así, el alcance oscilará aproximadamente entre -2.147 millones y 2.147 millones. Los lenguajes de programación suelen ofrecer tipos de datos enteros que se representan mediante 16, 32 o 64 bits; de este modo se dipone de un alcance adecuado para la mayoría de las tareas. Los enormes enteros de 64 bits suelen emplearse en temas relacionados con las matemáticas financieras, en las que un error de redondeo puede supone diferencias inaceptables.
-
Los números reales (en el sentido matemático habitual) también se representan mediante colecciones de bits; una vez más, es frecuente construir representaciones formadas por 32 bits. En este caso, se reparten los bits de la representación para almacenar un exponente y una mantisa. El resultado es que se dispone de un alcance aproximado de +/-10
30
; los bits dedicados a mantisa producen como resultado un número de decimales (una precisión) de 4 o 5 dígitos decimales. Evidentemente, el alcance no es infinito, y la precisión mucho menos, pero hay muchas tareas en que basta esta representación para llegar a resultados satisfactorios. Si se precisan números de mayor alcance y precisión, pueden emplearse 64 bits en la representación, o incluso 80. Desde luego, las representaciones más extensas no deben emplearse a la ligera, pues suponen un mayor consumo de memoria y bastante más tiempo de procesamiento. Con todo, será la aplicación construida la que dictamine el alcance y precisión de los números empleados.
En lo que toca a la representación de información de tipo textual, se emplea un procedimiento consistente en asignar valores numéricos a los elementos gráficos mediante los cuales se representa la información en los lenguajes humanos:
-
Las letras del alfabeto romano, por mencionar un ejemplo corriente, se pueden representar mediante bytes (un byte por letra); un byte ofrece 256 posibilidades, que resultan ser bastantes aunque se incluyan signos diacríticos, de puntuación y de control de impresión. Por ejemplo, la letra 'A' (con mayúsculas) tiene asignado el valor decimal 65, la 'B' es el 66, etc. etc. Para formar frases basta con poner una letra (un byte) detrás de otro en memoria, para luego representar esos bytes en pantalla (no procede estudiar aquí los conceptos de Autoedición y Tipografía electrónica).
-
Los alfabetos griego y cirílico son distintos del romano y tienen sus propias peculiaridades, pero el método empleado para su representación sigue siendo el mismo, y se asocia un valor numérico a cada letra. Este tipo de representación recibe, en el caso del alfabeto romano, el nombre de código ASCII (American Standard Code for Information Interchange, véase
[1]
y, en desde otro punto de vista,
[2]
, aunque el estándar ASCII fue creado por el comité
[3]
). No se debe pensar, sin embargo, que aquí acaba la historia.
-
Los sistemas de escritura pueden estar basados en ideogramas (japonés, chino) y no siempre se escribe un documento de izquierda a derecha, o desde la página frontal hasta la posterior (árabe). Los sistemas de escritura mencionados no pueden describirse mediante un único byte, debido al elevado número de símbolos de que hacen uso, y el ordenador se ve obligado a emplear dos bytes para poder mostrar en pantalla estos tipos de escritura. El método empleado en estos casos puede ser
Unicode
.
Sea cual fuere el método de codificación empleado, las cadenas de caracteres (
strings
en el argot informático) no pueden ser tan largas como se desee. Además, el ordenador necesita conocer de antemano la la longitud de la cadena, o bien el último byte de memoria que ocupa, para poder manipularla y representarla. El lenguaje Pascal antepone un byte de longitud a la cadena; por su parte, el lenguaje C pospone un byte de marcación de fin de cadena, el byte '\0', para indicar el fin de la misma. Ambos métodos poseen ventajas e inconvenientes.
Tipos de datos atómicos y estructurados. Tipos homogéneos e inhomogéneos
La representación interna empleada en el ordenador está formada por bits; todos los tipos de datos se reducen en última instancia a colecciones de bits. Por tanto, el únito tipo de datos que realmente no posee una estructura interna es el bit; todos los demás poseen "partes" a las que se puede acceder, aunque quizá de forma indirecta. Llamaremos tipos de datos atómicos a los tipos numéricos y caracteres, caracterizados porque no poseen partes más pequeñas a las que se pueda acceder, salvo los bits que los componen, como se ha dicho. Llamaremos tipos de datos estructurados a las matrices y estructuras (struct), caracterizados porque poseen partes más pequeñas (sus elementos o campos) a los que es posible acceder. Los tipos estructurados son colecciones de tipos atómicos, o de otros tipos estructurados, pero finalmente el tipo estructurado más anidado caba por poseer unicamente componentes atómicos. Dentro de los tipos estructurados, se distingen dos variedades: los tipos homogéneos, que están formados por elementos (atómicos o no) de igual tipo, y los heterogéneos, que están formados por elementos (atómicos o no) de distinto tipo. Los tipos de datos estructurados homogéneos se denominan matrices (listas, tablas, etc.). Los tipos de datos estructurados heterogéneos se llaman registros o estructuras.
Tipos de datos incorporados
Normalmente, los lenguajes poseen una cierta cantidad de tipos de datos "estándar" que son los que cabría esperar (tipos numéricos y alfanuméricos). A estos tipos de datos se les conoce con el nombre de tipos de datos incorporados (
built-in
), y se pueden utilizar directamente, sin necesidad de definirlos. Sin embargo, los tipos de datos estándar son muy generales, y no se adaptan a la aplicación concreta de cada programador. Por consiguiente, los lenguajes ofrecen mecanismos para crear
Tipos de datos definidos por el usuario
Son aquellos que el usuario construye tomando como primitivas de construcción los datos incorporados del lenguaje, o quizá otros tipos definidos por elusuario. De este modo se pueden construir (normalmente por aglutinación) tipos de datos que satisfagan mejor las necesidades del programador. Un ejemplo muy frecuente son las listas formadas por elementos de distintos tipos (incorporados o no), y los punteros o referencias de elementos de todo tipo (que contienen la dirección de un elemento de un tipo concreto).