La différence de 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 ?

La différence est définie dans les sections de la norme C99 citées par Carl Norum. Mais il peut être utile d’avoir un exemple.

Supposons que vous ayez un compilateur C pour un système 36 bits, avec char = 9 bits, short = 18 bits, int = 36 bits et long = 72 bits. alors

  • int8_t n’existe pas , car il n’y a aucun moyen de satisfaire la contrainte d’avoir exactement 8 bits de valeur sans remplissage.
  • int_least8_t est un typedef de char . PAS de short ou int , car le standard nécessite le plus petit type avec au moins 8 bits.
  • int_fast8_t peut être n’importe quoi. Ce sera probablement un typedef de int si la taille “native” est considérée comme “rapide”.

Dans la section des spécifications 7.8.1.1 Types d’entiers de largeur exacte , paragraphe 1:

Le nom typedef int N _t désigne un type entier signé avec une largeur N, aucun bit de remplissage et une représentation de complément à deux. Ainsi, int8_t désigne un type entier signé avec une largeur de exactement 8 bits.

Et à partir de: 7.18.1.2 Types d’entiers de largeur minimale , paragraphe 1:

Le nom typedef int_least N _t désigne un type entier signé avec une largeur d’au moins N, tel qu’aucun type entier signé avec une taille inférieure n’a au moins la largeur spécifiée. Ainsi, int_least32_t désigne un type entier signé d’une largeur d’au moins 32 bits.

Et enfin à partir de 7.18.1.3 Les types d’entiers de largeur minimale les plus rapides , paragraphe 2:

Le nom typedef int_fast N _t désigne le type entier signé le plus rapide avec une largeur d’au moins N. Le nom typedef uint_fast N _t désigne le type d’entier non signé le plus rapide avec une largeur d’au moins N.

intN_t (et uintN_t ) n’est pas requirejs dans toutes les implémentations C99 . Ces types sont les “types d’entiers de largeur exacte”. Ils sont nécessaires dans les implémentations où il est logique de les avoir (essentiellement tous les ordinateurs de bureau).

int_leastN_t est requirejs dans toutes les implémentations C99 pour les valeurs N de 8, 16, 32 et 64. Il s’agit des “types d’entiers de largeur minimale”.

int_fastN_t est requirejs dans toutes les implémentations C99 pour les valeurs N de 8, 16, 32 et 64. Il s’agit des “types d’entiers de largeur minimale les plus rapides”.

Voici une réponse conceptuellement simple: la largeur de int * N_t pour les trois types doit être> = N. intN_t a exactement N bits, int_leastN_t est le type le moins (le plus étroit) et int_fastN_t est le type le plus rapide .

Par exemple, sur une machine avec des octets de 8 bits et des registres rapides de 32 bits, int8_t et int_least8_t sont aliasés au caractère signé mais int_fast8_t est aliasé à int32_t. Alors que si l’implémentation a choisi de les définir, int_least24_t et int_fast24_t seraient tous deux aliasés à int32_t, avec int24_t non défini.

Edit: comme Technophile le souligne ci-dessous, le véritable problème pour les types rapides est la mémoire, pas les registres (en général, les opérations sur les bits de poids faibles des registres peuvent être effectuées aussi rapidement que sur l’ensemble du registre). Par exemple, écrire dans un int8_t en mémoire peut nécessiter de charger le mot de 32 bits qui le contient, en modifiant uniquement l’octet, puis en le réécrivant, alors que s’il était stocké dans 32 mots, il pourrait être écrit sans lecture.

Celles-ci sont liées à la taille de l’entier et correspondent à leur apparence.

 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.