El lenguaje C es un lenguaje de programación utilizado en una amplia gama de aplicaciones, como sistemas embebidos y programación de sistemas. Entre ellos, los «tipos de datos» y sus «tamaños» tienen un gran impacto en el uso de memoria del programa y en el rendimiento. En particular, al ejecutar programas en entornos diferentes (32 bits / 64 bits, Windows / Linux, etc.), el tamaño de los tipos de datos puede variar, por lo que es importante seleccionar el tipo correcto. En este artículo, se explica el tamaño de los tipos de datos básicos en C, las diferencias según el entorno y los puntos clave para seleccionar tipos adecuados. Además, se presenta información práctica sobre el uso del operador sizeof y los métodos de aprovechamiento de los tipos de enteros de ancho fijo (stdint.h), entre otros. Con esto, profundizará su comprensión de los tipos en C y podrá realizar una programación eficiente.
2. Tipos de datos básicos y tamaños en C
2.1 Lista de tamaños de tipos enteros
Tipo de datos
Entorno de 32 bits
Entorno de 64 bits
Tamaño mínimo
char
1 byte
1 byte
1 byte
short
2 bytes
2 bytes
2 bytes
int
4 bytes
4 bytes
2 bytes
long
4 bytes
8 bytes
4 bytes
long long
8 bytes
8 bytes
8 bytes
2.2 Lista de tamaños de tipos de punto flotante
Tipo de datos
Entorno de 32 bits
Entorno de 64 bits
float
4 bytes
4 bytes
double
8 bytes
8 bytes
long double
8-16 bytes
16 bytes
3. Dependencia del entorno en el tamaño de los tipos de datos
3.1 Diferencias en el tamaño según el SO y el compilador
Tipo de datos
Windows (LLP64)
Linux (LP64)
Entorno de 32 bits
int
4 bytes
4 bytes
4 bytes
long
4 bytes
8 bytes
4 bytes
long long
8 bytes
8 bytes
8 bytes
4. sizeof Confirmar el tamaño de los tipos de datos con el operador
4.1 sizeof Lo básico de
#include
int main() {
printf("Size of int: %zu bytesn", sizeof(int));
printf("Size of double: %zu bytesn", sizeof(double));
return 0;
}
5. Tipos de enteros de ancho fijo (stdint.h uso de)
#include
#include
int main() {
int8_t a = 100;
uint16_t b = 50000;
int32_t c = -123456;
uint64_t d = 1000000000ULL;
printf("Tamaño de int8_t: %zu bytes\n", sizeof(a));
printf("Tamaño de uint16_t: %zu bytes\n", sizeof(b));
printf("Tamaño de int32_t: %zu bytes\n", sizeof(c));
printf("Tamaño de uint64_t: %zu bytes\n", sizeof(d));
return 0;
}
6. Tamaño y alineación de la estructura
6.1 Distribución de memoria de la estructura
#include
struct example {
char a;
int b;
double c;
};
int main() {
printf("Size of struct: %zu bytesn", sizeof(struct example));
return 0;
}
7. Cómo elegir el tipo de datos adecuado
7.1 Cómo elegir tipos de enteros
Tipo de datos
Tamaño
Rango
int8_t
1B
-128 a 127
uint8_t
1B
0 a 255
int32_t
4B
Aprox. -2.1B a 2.1B
uint32_t
4B
0 a 4.2B
8. Preguntas frecuentes (FAQ)
Q1: ¿Por qué el resultado de sizeof es de tipo unsigned int?
A:En C, el valor de retorno de sizeof es del tipo size_t, que es un tipo de entero sin signo. Se define como un tipo seguro porque no existen tamaños negativos.
size_t size = sizeof(int);
printf("Size of int: %zu bytesn", size);
9. Resumen
9.1 Puntos importantes de este artículo
✅El tamaño del tipo de datos depende del entorno✅sizeof para confirmar el tamaño real✅Aprovechar los tipos de enteros de ancho fijo✅El tamaño de la estructura se ve afectado por el alineamiento de memoria✅La elección adecuada del tipo de datos