En general, una de las primeras cosas que se inyecta en la mente de un alumno de programación es el concepto de tipo de dato, también denominado dominio de datos. El tipo de dato es uno de esos conceptos abstractos de la informática que, sin ser complicado de comprender, fastidia a mucha gente porque no es transferible a algo concreto y real. Vamos a estudiarlo a fondo en este artículo.
El tipo de dato es el molde con forma de señor de galleta de jengibre. Es un formato o molde con el cual vamos a dar forma a los datos de nuestro programa. El tipo de dato es el concepto que sobrevuela a prácticamente cualquier cosa en un programa informático: variables, constantes, funciones, clases, colecciones… Absolutamente todo lo que se usa en un programa informático está modelado por un tipo de dato. Vamos a intentar comprender el alcance que tiene este elemento en un código informático y hasta que punto es relevante.
# Tipos básicos
Un tipo básico de un lenguaje es cualquier tipo de dato que modela datos que son directamente representables en la memoria de forma atómica. Esta definición significa simplemente que un tipo de dato básico es un tipo cuyos valores son únicos e indivisibles. Estos tipos se definen por su longitud en bytes en memoria, y son los tipos más irreducibles, es decir, no se pueden dividir en otros más pequeños que tengan significado:
byte o char: un byte es un conjunto de 8 bits en la memoria del ordenador. Es la unidad informática más pequeña representable de forma directa.
número entero: de distintos tamaños (16, 32, 64 bits) el número entero permite representar datos numéricos positivos o negativos sin decimales.
número decimal o flotante: de 32 y 64 bits, el número decimal que permite representar números fraccionarios con coma flotante.
Estos tipos de datos son todos ellos numéricos y por defecto, pueden ser positivos y negativos (existen las correspondientes versiones sin signo en los mismos tamaños de memoria). C y C++ se manejan prácticamente por entero con estos tipos de datos, ya que no generan representaciones mixtas o más complejas de sus datos básicos a nivel de compilador. En general, los tipos de datos básicos habituales en cualquier lenguaje, al menos en lenguajes de tipos fuertes y estrictos, serían los siguientes:
Tipos enteros:
byte / char (8 bits)
short / word (16 bits)
int / integer (32 bits)
long / longint (64 bits)
Tipos decimales:
float (32 bits)
double (64 bits)
decimal / real (variable según la plataforma)
Antes de terminar con esta sección, mencionar el tipo bool o boolean, que sin ser un tipo de dato básico o nativo, se suele asimilar con el byte en sus valores true (1) y false (0).
# Tipos definidos por el usuario
Existen tres tipos definidos por el usuario, que no son otra cosa que tipo compuestos que no acompañan al compilador y que no son directamente representables en memoria de forma directa (es decir, no son “comprensibles” por la máquina en la memoria):
Enumeraciones: permite definir variables cuyos datos son una acotación de posibles valores. Ejemplo: la enumeración DiasSemana tiene los valores Lunes, Martes, Miércoles, Jueves, Viernes, Sábado, Domingo.
Estructuras / registro: conjuntos de valores de distintos tipos que forman una ramificación de datos, formando un conjunto de variables que forman parte de la variable estructura. Ejemplo: una estructura Cliente tiene datos almacenados en variables llamadas nombre, apellidos, localidad, nif, etc…
Clases: estructuras especiales que además de datos, contienen también código en forma de funciones llamadas métodos.
Cabe mencionar un tipo definido por el usuario menos popular pero que todavía se utiliza en algunos lenguajes como Pascal y que han tenido un resurgimiento con lenguajes como Python, que son los rangos, que básicamente son conjuntos de posibles valores acotados personalizados por el usuario. Es decir, si un byte sin signo puede tener valores entre 0 y 255, se puede crear un rango que tenga específicamente los valores entre 1 y 20, y una variable definida de ese rango no puede tener valores fuera de esa acotación.
# ¿Y qué pasa con el texto?
Alguno se estará preguntando qué pasa con las variables de texto o cadenas de texto (string). Per se, no son tipos de datos hasta que se convierten en tales por causa de las librerías de código de los lenguajes. En C, las cadenas de texto se manejan a través de un tipo de variable, no de dato (char *, puntero de char). En C++ y sus lenguajes derivados como Java o Csharp, se manejan a través de una clase, aunque no son objetos al uso, cosa que ya comentaré un poco más adelante en un próximo artículo sobre los objetos. En otros lenguajes como Pascal se convierten en una suerte de conjunto de caracteres indexados (un array de char), gestionado internamente por el compilador; y en cuanto a otros lenguajes como los interpretados, cada uno maneja este tipo de dato de formas muy diversas. Pero en todo caso, y a pesar de lo excepcional que es, es uno de los más usados en un programa y tenemos que aprender a manejarlo correctamente si no queremos sudar tinta programando.
# En resumen
Los tipos de datos que vamos a poder usar en general en cualquier programa son, de forma resumida, los que he presentado aquí. Algunos lenguajes tienen tipos de datos relativamente extraños o especializados, como Python, que de forma nativa tiene hasta 4 tipos de colecciones diferentes con sus propias características (mientras que de forma habitual, la mayoría de los lenguajes sólo manejan de forma nativa arrays), pero con esta información podemos manejarnos de forma básica en la mayoría de los entornos. Más adelante veremos los tipos de variables y porqué no debemos confundirlos con los tipos de datos.