Quelle est la difference entre “short int” et “int” en C?

Comment short int (ou short) et int différent en C? Ils ont la même taille et la même gamme. Si elles sont essentiellement identiques, à quoi sert-il d’avoir deux types de données?

Ils peuvent avoir la même taille, mais il est garanti que int est égal ou supérieur à short int .

En théorie / selon le standard C, ils pourraient avoir n’importe quelle taille si short <= int .

Dans le monde réel, c'est ainsi que les tailles sont mises en œuvre.

 CPU short int 8 bit 16 16 16 bit 16 16 32 bit 16 32 64 bit 16 32 

Ne vous fiez jamais à un type de données ayant une taille donnée en C. Vérifiez toujours les limites dans limits.h en cas de doute.

C99 N1256 projet standard

Tout ce que nous soaps maintenant est que:

 2 <= sizeof(short) <= sizeof(int) 

5.2.4.2.1 Tailles des types entiers donne les tailles minimales:

1 [...] Leurs valeurs définies pour la mise en œuvre doivent être égales ou supérieures en magnitude (valeur absolue) à celles indiquées [...]

  • UCHAR_MAX 255 // 2 8 - 1
  • USHRT_MAX 65535 // 2 16 - 1
  • UINT_MAX 65535 // 2 16 - 1
  • ULONG_MAX 4294967295 // 2 32 - 1
  • ULLONG_MAX 18446744073709551615 // 2 64 - 1

6.2.5 Les types disent alors:

8 Pour deux types entiers avec le même niveau de signature et un rang de conversion d'entier différent (voir 6.3.1.1), la plage de valeurs du type avec un rang de conversion d'entier plus petit est une sous-gamme des valeurs de l'autre type.

et 6.3.1.1 Des booléens, des caractères et des entiers déterminent les rangs de conversion relatifs:

1 Chaque type d’entier a un rang de conversion d’entier défini comme suit:

  • Le rang de long long int doit être supérieur au rang de long int, qui doit être supérieur au rang de int, qui doit être supérieur au rang de short int, qui doit être supérieur au rang de char signé.
  • Le rang de tout type entier non signé doit être égal au rang du type entier signé signé, le cas échéant.
  • Pour tous les types entiers T1, T2 et T3, si T1 a un rang supérieur à T2 et T2 a un rang supérieur à T3, alors T1 a un rang supérieur à T3.

Cela dépend du système. Certains systèmes d’exploitation n’auront pas la même longueur pour les deux types.

“Un entier court dans un langage de programmation peut avoir une taille différente dans un langage différent ou sur un processeur différent. Dans certains langages, cette taille est fixe sur toutes les plates-formes, tandis que dans d’autres, elle dépend de la machine. Dans certains langages, ce type de données n’existe pas. du tout.”

La source

En réalité, tout dépend du compilateur et du système. Mais la règle de base dit que int ne peut jamais être inférieur à court et ne peut jamais être supérieur à long.

court <= int <= long

Je travaillais sur le même aujourd’hui. Ma conclusion est que cela dépend de la longueur de mot de l’architecture de la machine sur laquelle votre programme est exécuté. Selon la documentation de C99 limits.h.

 /* Minimum and maximum values a `signed short int' can hold. */ # define SHRT_MIN (-32768) # define SHRT_MAX 32767 /* Maximum value an `unsigned short int' can hold. (Minimum is 0.) */ # define USHRT_MAX 65535 /* Minimum and maximum values a `signed int' can hold. */ # define INT_MIN (-INT_MAX - 1) # define INT_MAX 2147483647 /* Maximum value an `unsigned int' can hold. (Minimum is 0.) */ # define UINT_MAX 4294967295U /* Minimum and maximum values a `signed long int' can hold. */ # if __WORDSIZE == 64 # define LONG_MAX 9223372036854775807L # else # define LONG_MAX 2147483647L # endif # define LONG_MIN (-LONG_MAX - 1L) /* Maximum value an `unsigned long int' can hold. (Minimum is 0.) */ # if __WORDSIZE == 64 # define ULONG_MAX 18446744073709551615UL # else # define ULONG_MAX 4294967295UL # endif 

Faites-moi savoir si quelqu’un a une meilleure réponse.

short et int doivent avoir au moins 16 bits, long, au moins 32 bits, et short n’est pas plus long que int, ce qui n’est pas plus long. Typiquement, court correspond à 16 bits, long à 32 bits et int à 16 ou 32 bits.