Tipos de datos básicos

Por

Los programas requieren procesar datos para proporcionar una información que nos resulte útil al momento de tomar decisiones, o para realizar ciertas actividades específicas. Los datos son pequeñas unidades informativas con un significado coherente; con ellos es posible describir objetos, magnitudes, hechos, ideas, situaciones, etc.

Ilustración con diferentes ejemplos de tipos de datos

Los datos se pueden expresar mediante palabras, letras, símbolos, números, y signos de puntuación. Ejemplos de datos pueden ser las cifras numéricas de un reporte de ventas, o los parámetros físicos, como humedad y temperatura, que se utilizan para dar el estado del clima.

Atributos para tipos de datos

En la programación se utilizan diferentes tipos de datos; éstos se clasifican según los valores que pueden contener, o según la clase de operaciones que se pueda efectuar con ellos.

La mayoría de los lenguajes de programación, utilizan atributos que nos permiten especificar el tipo de valores que podrá admitir cualquier elemento que involucre datos (como una variable, una constante, o una función). A estos atributos se les conoce como tipos de datos o atributos de tipo, o simplemente tipos.

En el lenguaje Pascal, los atributos para los tipos de datos básicos predefinido están divididos en dos categorías principales: una para los datos de tipo simple y otra para los datos de tipo cadena.

Además de los atributos de tipos predefinidos, también, es posible crear o definir nuevos atributos de tipo, tomando como base a los tipos ya predefinidos. Al definir un "nuevo" atributo de tipo, se debe especificar el tipo de dato base, y el rango o conjunto de valores que podrá contener. En una definición de tipo de datos, se establece el identificador que representará al nuevo atributo de tipo.

diagrama para la definición de tipo de datos
Diagrama sintáctico para la definición de atributos de tipo de datos

Cuando un identificador se encuentra a la izquierda de una definición de tipo, será declarado como un atributo de tipo. Luego, este atributo podrá ser utilizado para declarar nuevas variables; las cuales estarán basadas en la definición de datos primitiva de dicho atributo.

Datos de tipo simple

Los datos de tipo simple pueden contener valores numéricos, o valores pertenecientes a un conjunto ordenado numéricamente. Ejemplos de valores para datos de tipo simple pueden ser los siguientes:

  • Números enteros como 0, 1, 2 , 3, …
  • Números reales como 0.25, 0.5, 1, 3.1416, …
  • Caracteres ASCII como "a", "b", "c" "d", …
  • Valores booleanos como Falso, Verdadero
  • Conjunto de valores como Lunes, Martes, Miércoles, …

Los datos de tipo simple se caracterizan en que solo pueden contener un único valor de una misma especie; es decir, no pueden estar compuestos por dos o más valores de iguales o distintas especies.

Los atributos para especificar datos de tipo simple, también se dividen en dos subcategorías: los de tipo ordinal y los de tipo real.

diagrama sintáctico de los tipos simples
Diagrama sintáctico para atributos del tipo simple (simple type)

Es importante tener en cuenta que, para especificar cada tipo de dato predefinido, en Pascal, se emplean nombres de atributos de tipo en inglés, tales como los que se verán en los apartados siguientes.

Datos de tipo ordinal

Los datos definidos como tipos ordinales, son aquellos que solo pueden contener valores pertenecientes a conjuntos ordenados. Los valores admitidos por este tipo de datos cumplen con las siguientes características:

  • Cada valor admitido por un dato tipo ordinal se rige por una secuencia; la cual indica su orden dentro del conjunto de valores al que pertenece.
  • Al primer valor admitido le corresponde el orden numérico 0; al segundo, le corresponde el orden numérico 1, y así sucesivamente para cada uno de los valores siguientes.
  • Para datos de tipo entero (subcategoría de los ordinales), el orden correspondiente a cada valor admitido es su propio valor numérico. Ejemplo, al valor 5 le corresponde el orden numérico 5.
  • En datos de tipo ordinal, cada valor tiene un predecesor, a excepción del primero; y a la vez, cada valor tiene un sucesor, a excepción del último.

Los atributos para la declaración de datos ordinales, se encuentran divididos en cinco subcategorías. Las tres primeras corresponden a atributos de los tipos predefinidos; y se utilizan para la declaración de datos de tipo entero, de tipo booleano, y de tipo carácter.

diagrama sintáctico de los tipos ordinales
Diagrama sintáctico para atributos del tipo ordinal

Las otras dos categorías, corresponden a los atributos de tipo para declaración de datos de tipo enumerado y datos de tipo subrango. Normalmente, es el usuario programador quien debe definir los atributos para estos dos últimos tipos de datos; además, tiene la posibilidad de asignarles sus propios identificadores, según sus necesidades.

Datos de tipo entero

Tal como su nombre lo indica, los datos de tipo entero, son aquellos que representan al conjunto de los números enteros. Estos datos pueden ser definidos mediante cinco atributos de tipo, cada uno de los cuales define un rango específico de valores. En tabla a continuación se muestra a cada atributo de tipo entero y sus respectivos rangos:

TipoRango de valoresTamaño
Shortint-128 .. 1278 bits
Byte0 .. 2558 bits
Integer-32768 .. 3276716 bits
Word0 .. 6553516 bits
Longint-2147483648 .. 214748364732 bits

En las operaciones aritméticas, la precisión de los valores tipo entero depende de su tamaño en bits. Normalmente, dos operandos en una operación son convertidos a un tipo común antes de efectuar dicha operación. Como tipo común se elige a uno cuyo rango abarque todos los valores posibles del tipo de ambos operandos. Por ejemplo; el tipo común entre Byte e Integer, es Integer; y el tipo común entre Word e Integer, es Longint. El resultado de las operaciones, es también optimizado a la precisión del tipo común.

Datos de tipo booleano

Los datos tipo booleano son aquellos que solo pueden tomar dos valores: falso o verdadero. En el lenguaje Pascal, la mayoría de compiladores implementan cuatro atributos predefinidos para los datos de tipo booleano; los cuales se resumen en la tabla a continuación:

TipoValor TrueTamaño
Boolean18 bits
Byteboolvalores <> 08 bits
Wordboolvalores <> 016 bits
Longboolvalores <> 032 bits

Los valores falso y verdadero son representados por los identificadores False y True, respectivamente. Este tipo de valores se obtienen como resultado de la comprobación de veracidad de expresiones booleanas. Así por ejemplo, al evaluar la expresión 2 + 10 = 15, se calificará como falsa puesto que no es válida su afirmación.

Debido a que los datos de tipo booleano son también tipos ordinales, sus valores mantendrán la siguiente relación:

False < True

En variables declaradas con el tipo Boolean, los valores False y True corresponden a los valores ordinales 0 y 1, respectivamente. Mientras que las declaradas con los tipos ByteBool, WordBool, o LongBool, el valor True toma valores ordinales diferentes a 0. Estos tres últimos tipos, normalmente se utilizan para proveer compatibilidad con otros compiladores y con el entorno de Windows.

Por lo tanto, una expresión cuyo resultado sea de tipo booleano, será considerada falsa (False) cuando su valor booleano sea cero; y verdadera (True) cuando su valor booleano sea uno, o diferente de cero.

Datos de tipo carácter

Los datos de tipo carácter pueden contener únicamente un carácter como valor. Un carácter es cualquier letra del alfabeto, número, símbolo, o incluso el espacio en blanco. Literalmente, un valor de tipo carácter se expresa escribiendo el carácter entre comillas, por ejemplo: 'a', 'B', '$', '&'.

Los valores de tipo carácter ocupan exactamente 8 bits; y al ser también tipos ordinales, a cada carácter le corresponde un orden numérico según su posición en la tabla de Caracteres ASCII Extendido.

Mediante la función Ord obtenemos el orden numérico de un valor tipo ordinal; mientras que la función Chr genera cualquier carácter según su orden numérico en la tabla ASCII. Por ejemplo:

CodAscii := Ord ('A');  {Asigna a la variable el valor 65}
ChrAscii := Chr (87);   {Asigna a la variable el carácter 'W'}

Datos de tipo enumerado

Los datos de tipo enumerado solo admiten valores pertenecientes a un conjunto especificado mediante una lista enumerada de valores. Normalmente, los atributos de tipo para declarar datos enumerados no están predefinidos en el lenguaje; por tanto, requieren ser definidos previamente por el programador.

El diagrama sintáctico para definición atributos de tipo enumerado es el siguiente:

diagrama sintáctico para definición de atributos de tipo enumerado

En la definición de un atributo de tipo enumerado; cada identificador, dentro de la lista enumerada, es declarado como un valor admitido para el tipo enumerado especificado a la izquierda de dicha definición. Al definir un nuevo atributo de tipo enumerado, no se permiten identificadores de valor que ya han sido declarados en otra lista enumerada de valores.

Veamos un ejemplo de definición de un atributo de tipo enumerado:

Type

   tSemana = (Lun, Mar, Mie, Jue, Vie, Sab, Dom);

En la anterior declaración, Jue es uno de los valores para el atributo de tipo tSemana. Es preciso tener en cuenta que, cada valor para un tipo enumerado es establecido mediante un identificador, y no mediante una cadena literal de caracteres.

En un atributo de tipo enumerado específico, el ordenamiento de sus valores sigue la misma secuencia de los valores definidos en su lista enumerada. Por ejemplo, al primer valor de una lista enumerada corresponde el orden numérico cero; al segundo, el orden numérico uno, y así sucesivamente.

Veamos, un ejemplo con una variable declarada con el atributo de tipo tSemana definido anteriormente:

Var
   D: integer;

   Dias: tSemana; {declara la variable con el tipo enumerado tSemana}

Begin

   Dias := Mie;    {Asigna el valor Mie}
   D := Ord(Dias); {Devuelve el valor 2}
   
   If Dias = Mie then
      Writeln('Miércoles');
   
End.

Puesto que los tipos enumerados son también tipos ordinales; cuando se aplica la función Ord a un valor de tipo enumerado, retornará el orden numérico de dicho valor, con respecto a otros valores de su tipo enumerado específico.

Datos de tipo subrango

Los datos de tipo subrango se limitan a contener valores dentro de un intervalo reducido de un tipo ordinal predefinido. Al tipo de valores especificados en el intervalo lo denominamos el tipo base. Para definir atributos de tipo para subrangos se especifican los valores mínimo y máximo del intervalo.

El diagrama sintáctico para definición de atributos de tipo subrango es el siguiente:

diagrama sintáctico para un atributo de tipo subrange

Los valores especificados en el intervalo deben ser del mismo tipo ordinal; dicho intervalo se indica siguiendo la forma: A .. B, donde A debe ser menor o igual a B. Algunos ejemplos de intervalos son:

 0 .. 99
-128 .. 127  
 Lun .. Vie

Una variable de tipo subrange posee todas las propiedades del tipo base; excepto que su valor, en tiempo de ejecución, estará limitado por el intervalo especificado.

La sintaxis extendida de Pascal permite usar expresiones en la sección de declaraciones de tipo (type). Considere las siguientes declaraciones:

Const
   X = 50;
   Y = 10;

Type
   Escala = (X - Y) * 2 .. (X + Y) * 2;

En la declaración anterior, se produce una ambigüedad sintáctica al intentar definir a Escala como un tipo subrange. Pues, la sintaxis del estándar Pascal considera que, si una de definición de tipo empieza con un paréntesis, se interpreta como un tipo enumerado. La solución es reorganizar la primera expresión del rango para evitar que empiece con un paréntesis, o definir otra constante equivalente al valor de la expresión y usar esa constante en la definición del tipo:

Type
   Escala = 2 * (X - Y) .. (X + Y) * 2;

Datos de tipo real

Los datos de tipo real son aquellos que admiten valores que son un subconjunto de los números reales, los cuales pueden representarse con una resolución fija de dígitos en notación de punto flotante. Para definir este tipo de datos se emplean cinco atributos predefinidos para tipos reales; cada uno difiere según la precisión y rango de valores que manejan, tal como se muestra en la siguiente tabla:

TipoRango de valoresDígitosTamaño
(Bytes)
Single1.5 x 10-45 .. 3.4 x 10387-84
Real2.9 x 10-39 .. 1.7 x 103811-126
Comp-9.2 x 1018 .. 9.2 x 101819-208
Double5.0 x 10-324 .. 1.7 x 1030815-168
Extended3.4 X 10-4932 .. 1.1 x 10493219-2010

En Turbo Pascal solo se puede utilizar por defecto el tipo real; para poder utilizar todos los tipos reales, es necesario activar, mediante código, el estado {$N+} de la directiva de compilación $N.

Datos de tipo cadena

Los datos de tipo cadena son aquellos que pueden contener una secuencia de caracteres alfanuméricos (letras, símbolos, y números). Adicionalmente, los datos de tipo carácter tienen un atributo de longitud dinámica, que indica el número de caracteres contenidos en tiempo de ejecución; y un atributo de longitud máxima de 255 caracteres.

Los datos de tipo cadena se definen mediante el atributo de tipo String; y el diagrama sintáctico para definición de un dato de este tipo es el siguiente:

diagrama sintáctico el atributo de tipo string

Una variable de tipo cadena, declarada sin el atributo de longitud, asumirá por defecto, la longitud máxima de 255 caracteres. Por ejemplo:

Var
   Titulo: string[20];   {Cadena de 20 caracteres}
   Descripcion: string;  {Cadena de 255 caracteres}

El valor actual de la longitud dinámica es retornado por la función estándar Length. Los caracteres en una variable tipo cadena pueden ser accedidos individualmente, igual que en los componentes de un arreglo vectorial, por ejemplo:

Titulo := 'Hello World';
Lg := Length (Titulo); {Retorna 11 en la variable Lg}
Ch := Titulo[7];       {Asigna 'W' en la variable Ch}

El ordenamiento entre cadenas se determina por la relación de orden de caracteres en posiciones correlativas. En dos cadenas de longitud diferente, cada carácter en la cadena más larga, sin caracteres correspondientes en la cadena más corta, asume un valor mayor. Por ejemplo, 'casas' es mayor que 'casa.' Las cadenas nulas sólo pueden ser iguales a otras cadenas nulas, y éstas asumen los menores valores de cadena.