[Guía completa] Tipos de datos y tamaños en C: explicación exhaustiva | Todo sobre int, long, struct y sizeof

1. Introducción

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 datosEntorno de 32 bitsEntorno de 64 bitsTamaño mínimo
char1 byte1 byte1 byte
short2 bytes2 bytes2 bytes
int4 bytes4 bytes2 bytes
long4 bytes8 bytes4 bytes
long long8 bytes8 bytes8 bytes

2.2 Lista de tamaños de tipos de punto flotante

Tipo de datosEntorno de 32 bitsEntorno de 64 bits
float4 bytes4 bytes
double8 bytes8 bytes
long double8-16 bytes16 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 datosWindows (LLP64)Linux (LP64)Entorno de 32 bits
int4 bytes4 bytes4 bytes
long4 bytes8 bytes4 bytes
long long8 bytes8 bytes8 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 datosTamañoRango
int8_t1B-128 a 127
uint8_t1B0 a 255
int32_t4BAprox. -2.1B a 2.1B
uint32_t4B0 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 entornosizeof para confirmar el tamaño realAprovechar los tipos de enteros de ancho fijoEl tamaño de la estructura se ve afectado por el alineamiento de memoriaLa elección adecuada del tipo de datos
侍エンジニア塾