c - uint16_t - uint32_t type
Diferencia entre int32, int, int32_t, int8 e int8_t (3)
Me encontré con el tipo de datos int32_t
en un programa C recientemente. Sé que almacena 32 bits, pero no int
e int32
hacen lo mismo.
Además, quiero usar char
en un programa. ¿Puedo usar int8_t
en int8_t
lugar? ¿Cuál es la diferencia?
Para resumir: ¿cuál es la diferencia entre int32, int, int32_t, int8 e int8_t en C?
Entre int32
e int32_t
, (y también entre int8
e int8_t
) la diferencia es bastante simple: el estándar C define int8_t
e int32_t
, pero no define nada llamado int8
o int32
- el último (si es que existe) es probablemente de algún otro encabezado o biblioteca (muy probablemente sea anterior a la adición de int8_t
e int32_t
en C99).
Plain int
es bastante diferente de los demás. Donde int8_t
e int32_t
tienen un tamaño específico, int
puede ser de cualquier tamaño> = 16 bits. En diferentes momentos, tanto 16 bits como 32 bits han sido razonablemente comunes (y para una implementación de 64 bits, probablemente debería ser de 64 bits).
Por otro lado, int
está garantizado para estar presente en cada implementación de C, donde int8_t
y int32_t
no lo están. Sin embargo, es probable que se cuestione si esto te importa. Si usa C en pequeños sistemas integrados y / o compiladores anteriores, puede ser un problema. Si lo usa principalmente con un compilador moderno en máquinas de escritorio / servidor, probablemente no lo será.
Vaya, se perdió la parte sobre char
. Utilizaría int8_t
lugar de char si (y solo si) desea que un tipo entero garantizado tenga exactamente 8 bits de tamaño. Si desea almacenar caracteres, probablemente quiera usar char
. Su tamaño puede variar (en términos de cantidad de bits), pero se garantiza que será exactamente de un byte. Sin embargo, una pequeña rareza: no hay garantía de si un char
simple está firmado o no (y muchos compiladores pueden convertirlo en uno, dependiendo de una bandera en tiempo de compilación). Si necesita asegurarse de que está firmado o no, debe especificarlo explícitamente.
Los tipos de datos _t son tipos typedef en el encabezado stdint.h, mientras que int es un tipo de datos fundamental integrado. Esto hace que _t esté disponible solo si stdint.h existe. int por otro lado se garantiza que existe.
Siempre tenga en cuenta que ''tamaño'' es variable si no se especifica explícitamente, por lo que si declara
int i = 10;
En algunos sistemas puede dar como resultado un entero de 16 bits por compilador y en algunos otros puede dar como resultado un entero de 32 bits (o un entero de 64 bits en los sistemas más nuevos).
En entornos integrados esto puede terminar en resultados extraños (especialmente al manejar E / S mapeadas en memoria o se puede considerar una situación de matriz simple), por lo que es muy recomendable especificar variables de tamaño fijo. En los sistemas heredados, puede encontrarse
typedef short INT16;
typedef int INT32;
typedef long INT64;
A partir de C99, los diseñadores agregaron el archivo de encabezado stdint.h que básicamente aprovecha los typedefs similares.
En un sistema basado en Windows, puede ver las entradas en el archivo de encabezado stdin.h como
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
typedef unsigned char uint8_t;
Hay mucho más para eso, como el entero de ancho mínimo o los tipos enteros de ancho exacto, creo que no es malo explorar stdint.h para una mejor comprensión.