C Tipos de datos

En el lenguaje C, el tipo de datos se refiere a un amplio sistema utilizado para declarar variables o funciones de diferentes tipos. El tipo de una variable determina el espacio que ocupa su almacenamiento y cómo se interpretan los patrones de bits almacenados.

Los tipos en C se pueden dividir en las siguientes categorías:

N.ºTipo y descripción
1Tipos de datos básicos
Son tipos aritméticos, incluyen entero (int), carácter (char), punto flotante (float) y doble precisión (double).
2Tipos de enumeración:
También son tipos aritméticos; se utilizan para definir variables que solo pueden recibir un conjunto de valores enteros discretos en el programa.
3Tipo void:
Especificador de tipovoidRepresenta un tipo de datos sin valor; normalmente se usa para valores de retorno de funciones.
4Tipos derivados:
Incluyen tipos de arreglo (array), tipos de puntero y tipos de estructura.

Los tipos de arreglo y estructura se denominan colectivamente tipos agregados. El tipo de una función se refiere al tipo de valor que devuelve. En el resto de esta sección presentaremos los tipos básicos; los otros tipos se explicarán en capítulos posteriores.

Tipos enteros

La siguiente tabla detalla el tamaño de almacenamiento y el rango de valores de los tipos enteros estándar:

TipoTamaño de almacenamientoRango de valores
char1 byte-128 a 127 o 0 a 255
unsigned char1 byte0 a 255
signed char1 byte-128 a 127
int2 o 4 bytes-32,768 a 32,767 o -2,147,483,648 a 2,147,483,647
unsigned int2 o 4 bytes0 a 65,535 o 0 a 4,294,967,295
short2 bytes-32,768 a 32,767
unsigned short2 bytes0 a 65,535
long4 bytes-2,147,483,648 a 2,147,483,647
unsigned long4 bytes0 a 4,294,967,295

Tenga en cuenta que el tamaño de almacenamiento de varios tipos está relacionado con la arquitectura del sistema, pero actualmente se utilizan principalmente sistemas de 64 bits.

A continuación se muestran las diferencias de tamaño entre sistemas de 32 bits y 64 bits (igual en Windows):

Para obtener el tamaño exacto de un tipo o variable en una plataforma específica, puede usar el operadorsizeofsizeof. La expresiónsizeof(type)sizeof(type) obtiene el tamaño de almacenamiento en bytes de un objeto o tipo. El siguiente ejemplo demuestra cómo obtener el tamaño del tipo int:

Ejemplo

#include <stdio.h> #include <limits.h> int main() { printf("Tamaño de almacenamiento de int: %lu\n", sizeof(int)); return 0; }

%lues un entero sin signo de 32 bits, para más detalles consulteFunciones de la biblioteca C - printf()。

Cuando compile y ejecute el programa anterior en Linux, producirá el siguiente resultado:

int 存储大小 : 4 

Tipos de punto flotante

La siguiente tabla detalla el tamaño de almacenamiento, el rango de valores y la precisión de los tipos de punto flotante estándar:

TipoTamaño de almacenamientoRango de valoresPrecisión
float4 bytes1.2E-38 a 3.4E+386 dígitos significativos
double8 bytes2.3E-308 a 1.7E+30815 dígitos significativos
long double16 bytes3.4E-4932 a 1.1E+493219 dígitos significativos

El archivo de cabecera float.h define macros; en el programa se pueden usar estos valores y otros detalles sobre la representación binaria de números reales. El siguiente ejemplo mostrará el espacio de almacenamiento ocupado por los tipos de punto flotante y su rango de valores:

Ejemplo

#include <stdio.h> #include <float.h> int main() { printf("Número máximo de bytes de almacenamiento de float: %lu\n", sizeof(float)); printf("Valor mínimo de float: %E\n", FLT_MIN ); printf("Valor máximo de float: %E\n", FLT_MAX ); printf("Valor de precisión: %d\n", FLT_DIG ); return 0; }

%Ees para generar números reales de precisión simple y doble en forma exponencial, consulteFunciones de la biblioteca C - printf()。

Cuando compile y ejecute el programa anterior en Linux, producirá el siguiente resultado:

float 存储最大字节数 : 4 
float 最小值: 1.175494E-38
float 最大值: 3.402823E+38
精度值: 6

Tipo void

El tipo void especifica que no hay valor disponible. Generalmente se usa en los siguientes tres casos:

N.ºTipo y descripción
1Función sin valor de retorno
En C hay varias funciones que no devuelven valor, o puede decir que devuelven vacío. El tipo de retorno de una función que no devuelve valor es vacío. Por ejemplovoid exit (int status);
2Parámetro de función vacío
En C hay varias funciones que no aceptan parámetros. Una función sin parámetros puede aceptar un void. Por ejemploint rand(void);
3Puntero a void
Un puntero de tipo void * representa la dirección de un objeto, no un tipo. Por ejemplo, la función de asignación de memoriavoid *malloc( size_t size );devuelve un puntero a void, que puede convertirse a cualquier tipo de datos.

Si por ahora aún no puede comprender completamente el tipo void, no se preocupe demasiado; en los capítulos siguientes explicaremos estos conceptos en detalle.


Conversión de tipos

La conversión de tipos es convertir un valor de un tipo de datos a un valor de otro tipo de datos.

En el lenguaje C hay dos tipos de conversión:

  • Conversión implícita de tipos:La conversión implícita de tipos ocurre automáticamente en una expresión, sin necesidad de ninguna instrucción explícita o llamada a función. Normalmente convierte automáticamente un tipo más pequeño a un tipo más grande, por ejemplo, convertir el tipo int a long o float a double. La conversión implícita de tipos también puede causar pérdida de precisión o truncamiento de datos.

  • Conversión explícita de tipos:La conversión explícita de tipos requiere el operador de conversión forzada (type casting operator), que puede forzar un valor de un tipo de datos a otro tipo de datos. La conversión forzada permite al programador tener un control más preciso sobre el tipo de datos cuando sea necesario, pero también puede provocar pérdida o truncamiento de datos.

Ejemplo de conversión implícita de tipos:

Ejemplo

int i = 10;
float f = 3.14;
double d = i + f; // Convierte implícitamente el tipo int a double

Ejemplo de conversión explícita de tipos:

Ejemplo

double d = 3.14159;
int i = (int)d; // Convierte explícitamente el tipo double a int
Otras extensiones