La diferencia de int8_t, int_least8_t e int_fast8_t?
(5)
Aquí hay una respuesta conceptual simple: el ancho de int * N_t para los tres tipos debe ser> = N. intN_t tiene exactamente N bits, int_leastN_t es el tipo menos (más estrecho), e int_fastN_t es el tipo más rápido .
Por ejemplo, en una máquina con bytes de 8 bits y registros rápidos de 32 bits, int8_t e int_least8_t tienen un alias para char firmado, pero int_fast8_t tiene un alias para int32_t. Mientras que, si la implementación decidiera definirlos, int_least24_t e int_fast24_t tendrían un alias para int32_t, con int24_t no definido.
Editar: como señala Technophile a continuación, el verdadero problema para los tipos rápidos es la memoria, no los registros (generalmente, las operaciones en los bits de registros de bajo orden se pueden hacer tan rápido como en todo el registro). Por ejemplo, escribir en un int8_t en la memoria puede requerir cargar la palabra de 32 bits que lo contiene, modificar solo el byte y luego volver a escribirlo, mientras que si se almacenara en 32 palabras, podría escribirse sin leer.
¿Cuál es la diferencia entre los tipos int int8_t
, int_least8_t
e int_fast8_t
?
De la sección de especificaciones 7.8.1.1 Tipos enteros de ancho exacto , párrafo 1:
El nombre typedef
int
N_t
designa un tipo de entero con signo con ancho N, sin bits de relleno y una representación de complemento de dos. Por lo tanto,int8_t
denota un tipo entero con signo con un ancho de exactamente 8 bits.
Y a partir de: 7.18.1.2 Tipos enteros de ancho mínimo , párrafo 1:
El nombre typedef
int_least
N_t
designa un tipo de entero con signo con un ancho de al menos N, de modo que ningún tipo entero con signo y con un tamaño menor tenga al menos el ancho especificado. Por lo tanto,int_least32_t
denota un tipo entero con signo con un ancho de al menos 32 bits.
Y, por último, de 7.18.1.3 Tipos enteros de ancho mínimo más rápidos , párrafo 2:
El nombre de typedef
int_fast
N_t
designa el tipo de entero con signo más rápido con un ancho de al menos N. El nombre typedefuint_fast
N_t
designa el tipo entero sin signo más rápido con un ancho de al menos N.
Estos están relacionados con el tamaño del número entero y son exactamente como suenan.
int8_t is exactly 8 bits
int_least8_t is the smallest int type that has at least 8 bits
int_fast8_t is the fastest int type that has at least 8 bits.
La diferencia se define en las secciones del estándar C99 que citó Carl Norum. Pero puede ser útil tener un ejemplo.
Supongamos que tiene un compilador de C para un sistema de 36 bits, con char
= 9 bits, short
= 18 bits, int
= 36 bits y long
= 72 bits. Entonces
-
int8_t
no existe , porque no hay forma de satisfacer la restricción de tener exactamente 8 bits de valor sin relleno. -
int_least8_t
es un typedef dechar
. NO deshort
oint
, porque el estándar requiere el tipo más pequeño con al menos 8 bits. -
int_fast8_t
puede ser cualquier cosa. Es probable que sea un tipo deint
si el tamaño "nativo" se considera "rápido".
intN_t
(y uintN_t
) no es necesario en todas las implementaciones C99 . Estos tipos son los "tipos enteros de ancho exacto". Se requieren en implementaciones donde tiene sentido tenerlas (básicamente, todas las computadoras de escritorio).
int_leastN_t
es necesario en todas las implementaciones C99 para valores de N de 8, 16, 32 y 64. Estos son los "tipos enteros de ancho mínimo".
int_fastN_t
es requerido en todas las implementaciones de C99 para valores de N de 8, 16, 32 y 64. Este es el "tipo entero de ancho mínimo más rápido".