# TIPOS DE DATOS

Los tipos de datos en C se refiere a un extenso sistema utilizado para declarar variables p funciones de diferentes tipos. El tipo de una variable determina cuanto espacio ocupa en el almacenamiento y como se interpreta el patron de bits almacenado.

Los tipos en C se pueden clasificar de la siguiente manera:

<table data-header-hidden><thead><tr><th width="150"></th><th></th></tr></thead><tbody><tr><td>Sr.No.</td><td>Tipos y descripción</td></tr><tr><td>1</td><td><p>Tipos basicos</p><p>Son tipos aritméticos y se clasifican además en: (a) tipos enteros y (b) tipos de coma flotante.</p></td></tr><tr><td>2</td><td><p>Tipos enumerados</p><p>Son nuevamente tipos aritméticos y se usan para definir variables que solo pueden asignar ciertos valores enteros discretos a lo largo del programa.</p></td></tr><tr><td>3</td><td><p>El tipo vacío</p><p>El especificador de tipo <em>void</em> indica que no hay ningún valor disponible.</p></td></tr><tr><td>4</td><td><p>tipos derivados</p><p>Incluyen (a) tipos de puntero, (b) tipos de matriz, (c) tipos de estructura, (d) tipos de unión y (e) tipos de función.</p></td></tr></tbody></table>

Los tipos de matriz y los tipos de estructura se denominan colectivamente como tipos agregados. El tipo de una funcion especifica el tipo de valor de retorno de la funcion.&#x20;

## Tipos de Enteros

La siguienete tabla proporciona los detalles de los tipos de enteros estandar con sus tamaños de almacenamiento y rangos de valores:

<table><thead><tr><th width="189.99999999999997">Type</th><th>Storage size</th><th>Value range</th></tr></thead><tbody><tr><td>char</td><td>1 byte</td><td>-128 to 127 or 0 to 255</td></tr><tr><td>unsigned char</td><td>1 byte</td><td>0 to 255</td></tr><tr><td>signed char</td><td>1 byte</td><td>-128 to 127</td></tr><tr><td>int</td><td>2 or 4 bytes</td><td>-32,768 to 32,767 or -2,147,483,648 to 2,147,483,647</td></tr><tr><td>unsigned int</td><td>2 or 4 bytes</td><td>0 to 65,535 or 0 to 4,294,967,295</td></tr><tr><td>short</td><td>2 bytes</td><td>-32,768 to 32,767</td></tr><tr><td>unsigned short</td><td>2 bytes</td><td>0 to 65,535</td></tr><tr><td>long</td><td>8 bytes or (4bytes for 32 bit OS)</td><td>-9223372036854775808 to 9223372036854775807</td></tr><tr><td>unsigned long</td><td>8 bytes</td><td>0 to 18446744073709551615</td></tr></tbody></table>

Para obtener el espacio exacto de un tipo o una variable en una platafoma en particular, puede usar el operador `sizeof` . Las expresiones sizeof(type) arrojan el tamaño de almacenamiento del objeto o tipo de bytes. A continuacion, veamos un ejemplo para obtener el tamaño de varios tipos en una maquina utilizando diferentes constantes definidas:

```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>

int main(int argc, char** argv) {

    printf("CHAR_BIT    :   %d\n", CHAR_BIT);
    printf("CHAR_MAX    :   %d\n", CHAR_MAX);
    printf("CHAR_MIN    :   %d\n", CHAR_MIN);
    printf("INT_MAX     :   %d\n", INT_MAX);
    printf("INT_MIN     :   %d\n", INT_MIN);
    printf("LONG_MAX    :   %ld\n", (long) LONG_MAX);
    printf("LONG_MIN    :   %ld\n", (long) LONG_MIN);
    printf("SCHAR_MAX   :   %d\n", SCHAR_MAX);
    printf("SCHAR_MIN   :   %d\n", SCHAR_MIN);
    printf("SHRT_MAX    :   %d\n", SHRT_MAX);
    printf("SHRT_MIN    :   %d\n", SHRT_MIN);
    printf("UCHAR_MAX   :   %d\n", UCHAR_MAX);
    printf("UINT_MAX    :   %u\n", (unsigned int) UINT_MAX);
    printf("ULONG_MAX   :   %lu\n", (unsigned long) ULONG_MAX);
    printf("USHRT_MAX   :   %d\n", (unsigned short) USHRT_MAX);
    
        return 0;
}
```

## Floating-Point Types

Veamos los detallles de los tipos de punto flotante con el tamaño de almacenamieto y rango de valores:

<table><thead><tr><th width="150">Type</th><th width="156">Storage size</th><th width="199">Value range</th><th>Precision</th></tr></thead><tbody><tr><td>float</td><td>4 byte</td><td>1.2E-38 to 3.4E+38</td><td>6 decimal places</td></tr><tr><td>double</td><td>8 byte</td><td>2.3E-308 to 1.7E+308</td><td>15 decimal places</td></tr><tr><td>long double</td><td>10 byte</td><td>3.4E-4932 to 1.1E+4932</td><td>19 decimal places</td></tr></tbody></table>

El archivo de encabezado float.h define macros que le permite usar estos valores y otros detalles sobre la representacion binaria de numeros reales en sus programas. Veamos un ejemplo:

```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>

int main(int argc, char** argv) {

    printf("Storage size for float : %d \n", sizeof(float));
    printf("FLT_MAX     :   %g\n", (float) FLT_MAX);
    printf("FLT_MIN     :   %g\n", (float) FLT_MIN);
    printf("-FLT_MAX    :   %g\n", (float) -FLT_MAX);
    printf("-FLT_MIN    :   %g\n", (float) -FLT_MIN);
    printf("DBL_MAX     :   %g\n", (double) DBL_MAX);
    printf("DBL_MIN     :   %g\n", (double) DBL_MIN);
    printf("-DBL_MAX     :  %g\n", (double) -DBL_MAX);
    printf("Precision value: %d\n", FLT_DIG );

    return 0;
}
```

## El tipo vacio

El tipo Void especifica que no hay ningun valor disponible. Se utilizan en tres tipos de situaciones:

<table data-header-hidden><thead><tr><th width="140"></th><th></th></tr></thead><tbody><tr><td>Sr.No.</td><td>Tipos y descripción</td></tr><tr><td>1</td><td><p>Función devuelve como vacío</p><p>Hay varias funciones en C que no devuelven ningún valor o puede decir que devuelven vacío. Una función sin valor de retorno tiene el tipo de retorno como nulo. Por ejemplo, void exit (estado int);</p></td></tr><tr><td>2</td><td><p>Argumentos de función como vacíos</p><p>Hay varias funciones en C que no aceptan ningún parámetro. Una función sin parámetro puede aceptar un vacío. Por ejemplo, int rand(void);</p></td></tr><tr><td>3</td><td><p>Punteros para anular</p><p>Un puntero de tipo void * representa la dirección de un objeto, pero no su tipo. Por ejemplo, una función de asignación de memoria void *malloc( size_t size ); devuelve un puntero a void que se puede convertir a cualquier tipo de datos.</p></td></tr></tbody></table>
