56 votes

La différence entre int8_t, int_least8_t et int_fast8_t?

Quelle est la différence entre les types int int8_t , int_least8_t et int_fast8_t ?

66voto

dan04 Points 33306

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 de short ou int, 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".

58voto

Carl Norum Points 114072

À 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 intN_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_leastN_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_fastN_t désigne la manière la plus rapide signé de type entier avec une largeur d'au moins N. Le typedef nom uint_fastN_t désigne le plus rapide type entier non signé d'une largeur d'au moins N.

16voto

pmg Points 52636

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".

14voto

Jim Balter Points 9250

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.

0voto

Hogan Points 30189

Celles-ci sont liées à la taille de l'entier et sont exactement ce qu'elles sonnent.

 int8_t is exactly 8 bits
int_least8_t is the smallest size that has at least 8 bits
int_fast8_t is the fastest size that has at least 8 bits.
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X