Tipos de datos en C
Los tipos de datos en un lenguaje de programación son todos aquellos tipos de valores que una variable puede representar o que una función puede devolver o aceptar como argumentos. En C existen los siguientes tipos de datos, primitivos y derivados. A continuación veremos cada uno en detalle.
Primitivos
Se les llama primitivos porque están definidos por el compilador. Dentro de los primitivos tenemos dos tipos a saber:
- Tipos enteros: char, short, int, long, long long y enum
- Tipos reales: float, double, y long double.
Cada tipo de dato entero tiene un rango definido, lo que significa que tiene un número de bits asignado. Recordemos que las computadoras funcionan internamente a base de bits (unos y ceros), lo que significa que de manera subyacente un número entero como por ejemplo 7 puede ser representado como 0000000000000111. El número de bits, indica el rango del tipo de dato. Además de esto, un entero puede tener o no signo, lo que significa que en el caso de tener signo, deberíamos reservar un bit para el signo.
Supongamos por un momento que queremos crear un nuevo tipo de dato llamado diminuto de 3 bits. Esto significa que el conjunto de números que puede guardar diminuto es el siguiente:
Binario | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
---|---|---|---|---|---|---|---|---|
Decimal | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Ahora imagina, que queremos guardar el signo en nuestro tipo de dato diminuto. Para esto debemos reservar un bit para el signo, si el bit más significativo es cero el valor es positivo, si es uno el valor es negativo. Así pues, nuestro tipo de datos estaría representado así.
Binario | Decimal |
---|---|
000 | 0 |
001 | +1 |
010 | +2 |
011 | +3 |
100 | -1 |
101 | -2 |
110 | -3 |
111 | -4 |
Nota además que para no entrar en ambigüedad acerca del número cero con signo (000) y sin signo (100) hemos dejado simplemente el cero como 000 y 100 representa el número -1 y de ahí en adelante siguen los demás. Así pues, nuestro tipo de dato tiene el rango de 0 a 7 para números sin signo, y de -4 a 3 para números con signo.
Esta misma lógica se utiliza para representados todos los demás números enteros, desde el más pequeño el cual es char
(8 bits) hasta el más grande que es long long
.
int
El tipo int se utiliza para representar números enteros de 32 bits de longitud (en compiladores antiguos podrían ser 16 bits). Podemos declarar enteros usando la palabra reservada int seguido del nombre de la variable o variables que deseamos declarar.
int a;
int a, b;
Podemos inicializar las variables anteriores de la siguiente forma:
a = 2353;
b = -14564;
Se puede asignar a un tipo entero un valor decimal, hexadecimal u octal. En el siguiente ejemplo se declaran e inicializan diferentes variables con el mismo valor en sus distintas representaciones
int a = 58;
int b = 072; // octal
int c = 0x3A; // hexadecimal
short
El tipo short se utiliza para representar números enteros de 16 bits de longitud (de -32768 a 32767). Cuando se utiliza el calificador unsigned puede representar números de 0 a 65535. Podemos declarar enteros usando las palabra s reservada short int seguido del nombre de la variable o variables que deseamos declarar.
short int a = 58;
Podemos omitir la palabra int
puesto que se sobreentiende que es un entero.
short a = 58;
long
El tipo long se utiliza para representar números enteros de 32 bits de longitud (en algunos compiladores podrían ser 64 bits). Podemos declarar enteros usando las palabra s reservada short int seguido del nombre de la variable o variables que deseamos declarar.
long int a = 58;
long int b = -1L; /* L indica que -1 es long */
Podemos omitir la palabra int
puesto que se sobreentiende que es un entero.
long a = 58;
long long
El tipo long long
se utiliza para representar números enteros de 64 bits de longitud. Podemos declarar enteros usando las palabras reservada long long int
seguido del nombre de la variable o variables que deseamos declarar.
long long int a = 58;
long long int b = -1LL; /* LL indica que -1 es long */
Podemos omitir la palabra int
puesto que se sobreentiende que es un entero.
long long a = 58;
float
El tipo float
se utiliza para representar un dato en coma flotante de 32 bits de longitud en el formato IEEE 754 (esto es un bit para el signo, 8 bits para el exponente y 23 para la mantisa). Este tipo de dato almacena valores con una precisión aproximada de siete dígitos. Podemos declarar enteros usando las palabras reservada float
seguido del nombre de la variable o variables que deseamos declarar.
float a = 8.2345F;
float b = 2.2e-5F; /* notación exponencial */
double
El tipo double
se utiliza para representar un dato en coma flotante de 64 bits de longitud en el formato IEEE 754 (esto es un bit para el signo, 11 bits para el exponente y 52 para la mantisa). Este tipo de dato almacena valores con una precisión aproximada de 16 dígitos. Podemos declarar enteros usando las palabras reservada double
seguido del nombre de la variable o variables que deseamos declarar.
float a = 8.2345;
float b = 2.2e-5; /* notación exponencial */
long double
El tipo long double
se utiliza para representar un dato en coma flotante de 80 bits de longitud, aunque a veces se almacena como 12 bytes o 16 bytes para mantener la alinecación de la estructura de datos. Este tipo de dato almacena valores con una precisión aproximada de 19 dígitos. Podemos declarar enteros usando las palabras reservada long double
seguido del nombre de la variable o variables que deseamos declarar.
long double a = 8.2345L; /* L indica long double */
char y enum
Como se mencionó anteriormente, el tipo de dato char es un tipo entero de 8 bits de longitud. Sin embargo, tiene un alcance un poco más allá de ser un entero, es por esto que puedes encontrar un poco más detalle en nuestro artículo Tipo Char en C.
El tipo de dato enum merece un artículo separado ya que su comportamiento es muy similar a las constantes o macros. En nuestro artículo Constantes en C puedes ver más a detalle este tipo de dato.
Finalmente puedes ver un poco más a detalle el almacenamiento de cada tipo de dato visitando nuestro artículo Tamaño de tipos de datos en C.
Tipos derivados
Los tipos derivados son construídos a partir de los tipos primitivos. Algunos de ellos son los arrays o matrices, estructuras, uniones, punteros y funciones. Cada uno de ellos se verá por aparte ya que cada uno requiere un poco más de detalle.
Antes de saltar a estos tipos de datos, es recomendable conocer otros aspectos fundamentales del lenguaje C como el ámbito, las cadenas de caracteres, sentencias de decisión y ciclos. Te invitamos a visitar el contenido completo del curso de programación en C.