Types de données C simples

Dupliquer possible:
La différence entre int8_t, int_least8_t et int_fast8_t?

Je suis un peu confus. Je pense … (corrigez-moi si je me trompe)

u_int8_t = unsigned short ? u_int16_t = unsigned int ? u_int32_t = unsigned long ? u_int64_t = unsigned long long ? int8_t = short ? int16_t = int ? int32_t = long ? int64_t = long long ? 

Alors que signifie int_fast8_t ? int_fastN_t ? int_least8_t ?

Celles-ci sont toutes spécifiées dans la norme C99 (section 7.18).

Les types [u]intN_t sont des types génériques (dans la norme ISO C) où N représente une largeur de bit (8, 16, etc.). 8 bits n’est pas nécessairement un caractère short ou short car les courts métrages / ententes / longs / etc. sont définis pour avoir une scope minimale (pas de largeur de bit) et peuvent ne pas être complémentaires.

Ces types les plus récents sont des compléments à deux indépendamment du codage des types les plus courants, qui peuvent être un complément à un ou un signe / grandeur (voir Représentation des nombres négatifs dans C? Et Pourquoi SCHAR_MIN est-il défini comme -127 dans C99? ).

fast et le least sont exactement ce qu’ils sonnent, types de largeur minimum-rapide et types d’au moins une largeur donnée.

La norme précise également quels types sont requirejs et lesquels sont facultatifs.

J’écris où int est de 16 bits:

 u_int8_t = unsigned char u_int16_t = unsigned int u_int32_t = unsigned long int u_int64_t = unsigned long long int int8_t = char int16_t = int int32_t = long int int64_t = long long int 

Q: “Alors qu’est-ce que int_fast8_t signifie? Int_fastN_t? Int_least8_t?”

Comme le dit dan04 dans sa réponse ici :

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

  • 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 la norme exige le plus petit type avec au moins 8 bits.
  • int_fast8_t peut être n’importe quoi. Il s’agira probablement d’un typedef de int si la taille “native” est considérée comme “rapide”.

Si vous êtes sous Linux plupart d’entre eux sont définis dans /usr/include/linux/coda.h . par exemple

 #ifndef __BIT_TYPES_DEFINED__ #define __BIT_TYPES_DEFINED__ typedef signed char int8_t; typedef unsigned char u_int8_t; typedef short int16_t; typedef unsigned short u_int16_t; typedef int int32_t; typedef unsigned int u_int32_t; #endif 

Et

 #if defined(DJGPP) || defined(__CYGWIN32__) #ifdef KERNEL typedef unsigned long u_long; typedef unsigned int u_int; typedef unsigned short u_short; typedef u_long ino_t; typedef u_long dev_t; typedef void * caddr_t; #ifdef DOS typedef unsigned __int64 u_quad_t; #else typedef unsigned long long u_quad_t; #endif