Quelle est la différence entre les types int int8_t
, int_least8_t
et int_fast8_t
?
Réponses
Trop de publicités?La différence est défini dans les sections du standard C99 que Carl Norum cité. Mais il peut être utile de disposer d'un exemple.
Supposons que vous avez un compilateur C pour un 36 bits système char
= 9 bits, short
= 18 bits, int
= 36 bits, et long
= 72 bits. Alors
-
int8_t
n'existe pas, car il n'y a pas de façon de satisfaire la contrainte d'avoir exactement la valeur 8 bits sans rembourrage. -
int_least8_t
est une définition de type d'char
. PAS deshort
ouint
, parce que la norme exige que le plus petit type avec au moins 8 bits. -
int_fast8_t
peut être n'importe quoi. Il est susceptible d'être une définition de type d'int
si le "natif" la taille est considérée comme "rapide".
À partir de la spécification de la section 7.8.1.1 Exacte de la largeur des types d'entiers, paragraphe 1:
Le typedef nom
int
N_t
désigne un entier signé de type avec une largeur de N , pas de rembourrage bits, et un complément à deux de la représentation. Ainsi,int8_t
désigne un entier signé de type avec une largeur de 8 bits.
Et de: 7.18.1.2 Minimum de la largeur des types d'entiers, paragraphe 1:
Le typedef nom
int_least
N_t
désigne un entier signé de type avec une largeur d'au moins N, tel que n entier signé de type, de moindre taille, il a au moins la largeur spécifiée. Ainsi,int_least32_t
désigne un entier signé de type avec une largeur d'au moins 32 bits.
Et enfin à partir de 7.18.1.3 plus Rapide minimum de la largeur des types d'entiers, paragraphe 2:
Le typedef nom
int_fast
N_t
désigne la manière la plus rapide signé de type entier avec une largeur d'au moins N. Le typedef nomuint_fast
N_t
désigne le plus rapide type entier non signé d'une largeur d'au moins N.
intN_t
(et uintN_t
) n'est pas requis dans tous les C99 implémentations. Ces types sont les "exacte de la largeur des types d'entiers". Ils sont nécessaires dans le cas d'applications où il est logique de les avoir (en gros chaque ordinateur de bureau).
int_leastN_t
est requis dans tous les C99 mise en œuvre pour les valeurs de N de 8, 16, 32 et 64. C'est le "minimum de la largeur des types d'entiers".
int_fastN_t
est requis dans tous les C99 mise en œuvre pour les valeurs de N de 8, 16, 32 et 64. C'est le "plus rapide minimum de la largeur des types d'entiers".
Voici un concept simple réponse: la largeur de l'int*N_t pour tous les trois types doit être >= N. intN_t a exactement N bits, int_leastN_t est le moins (plus étroit) de ce type, et int_fastN_t est le plus rapide de ce type.
Par exemple, sur une machine avec 8 bits, octets et 32 bits rapide registres, int8_t et int_least8_t sont des alias pour signed char mais int_fast8_t est un alias de int32_t. Considérant que, si la mise en œuvre a choisi de les définir, de int_least24_t et int_fast24_t serait à la fois être un alias de int32_t, avec int24_t gauche indéfini.