La librería stdint.h en C

La librería <stdint.h> en C proporciona tipos de datos enteros con tamaños específicos, lo que garantiza portabilidad entre diferentes arquitecturas. Es especialmente útil en programación de sistemas embebidos y cuando se necesita un control exacto sobre el tamaño de los datos.

📌 Tipos de datos en <stdint.h>

1. Tipos enteros con tamaño fijo

🔹 Se definen con un número exacto de bits, asegurando consistencia entre plataformas.

Tipo Tamaño Descripción Ejemplo
int8_t 8 bits Entero con signo (-128 a 127) int8_t a = -50;
uint8_t 8 bits Entero sin signo (0 a 255) uint8_t b = 200;
int16_t 16 bits Entero con signo (-32,768 a 32,767) int16_t c = -1000;
uint16_t 16 bits Entero sin signo (0 a 65,535) uint16_t d = 60000;
int32_t 32 bits Entero con signo (-2,147,483,648 a 2,147,483,647) int32_t e = 123456;
uint32_t 32 bits Entero sin signo (0 a 4,294,967,295) uint32_t f = 3000000000U;
int64_t 64 bits Entero con signo (-2⁶³ a 2⁶³-1) int64_t g = 9223372036854775807;
uint64_t 64 bits Entero sin signo (0 a 2⁶⁴-1) uint64_t h = 18446744073709551615U;

📌 Uso recomendado: Cuando necesitas manejar datos con un tamaño específico, como trabajar con protocolos de comunicación o archivos binarios.

2. Tipos de enteros de tamaño mínimo

🔹 Estos aseguran que el tipo tenga al menos el número de bits especificado.

Tipo Descripción Ejemplo
int_least8_t Entero con al menos 8 bits int_least8_t a = -50;
uint_least8_t Entero sin signo con al menos 8 bits uint_least8_t b = 255;
int_least16_t Entero con al menos 16 bits int_least16_t c = -1000;

📌 Uso recomendado: Cuando no necesitas un tamaño exacto, pero sí garantizar un mínimo de bits.

3. Tipos de enteros de tamaño más eficiente

🔹 Seleccionan el tipo de dato más eficiente para la arquitectura.

Tipo Descripción Ejemplo
int_fast8_t Entero más rápido con al menos 8 bits int_fast8_t a = -50;
uint_fast8_t Entero sin signo más rápido con al menos 8 bits uint_fast8_t b = 255;

📌 Uso recomendado: Cuando el rendimiento es prioritario sobre el tamaño exacto.

4. Tipos de enteros para punteros

🔹 Se utilizan para garantizar que los enteros puedan almacenar direcciones de memoria.

Tipo Descripción Ejemplo
intptr_t Entero con signo capaz de almacenar un puntero intptr_t p = (intptr_t) &variable;
uintptr_t Entero sin signo capaz de almacenar un puntero uintptr_t p = (uintptr_t) &variable;

📌 Uso recomendado: Cuando necesitas convertir un puntero en un número entero sin perder precisión.

5. Macros para límites

🔹 <stdint.h> también define macros para los valores mínimos y máximos de cada tipo.

#include <stdio.h>
#include <stdint.h>

int main() {
    printf("Máximo int16_t: %d\n", INT16_MAX);
    printf("Mínimo int16_t: %d\n", INT16_MIN);
    printf("Máximo uint32_t: %u\n", UINT32_MAX);
    return 0;
} 

 

🚀 Ejemplo práctico

Supongamos que estamos creando un mensaje de red que debe usar tipos de tamaño fijo para garantizar compatibilidad entre diferentes dispositivos:

#include <stdint.h>
#include <stdio.h>

typedef struct {
    uint16_t id;
    uint8_t tipo;
    int32_t dato;
} Mensaje;

int main() {
    Mensaje msg = {1001, 2, -5000};
    printf("ID: %u, Tipo: %u, Dato: %d\n", msg.id, msg.tipo, msg.dato);
    return 0;
} 

📌 Ventaja: Los datos tendrán exactamente el mismo tamaño en cualquier plataforma, lo que evita errores de compatibilidad.

 

🎯 Resumen

<stdint.h> permite definir enteros de tamaño exacto, mínimo y eficiente. 

Útil para programación de bajo nivel, redes y archivos binarios. 

Evita errores de compatibilidad en diferentes sistemas.

 

 

 

 

 

 

 

 

 

 

 

Destacado

Bootloader Avanzado en Ensamblador

Bootloader Avanzado en Ensamblador Características del Bootloader Se carga en la dirección 0x7C00 (BIOS). ...