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.