115 votes

Quelle est la différence entre un int et un long en C++ ?

Corrigez-moi si je me trompe,

int est de 4 octets, avec une gamme de valeurs allant de -2,147,483,648 à 2,147,483,647 (2^31)
long est de 4 octets, avec une plage de valeurs allant de -2 147 483 648 à 2 147 483 647 (2^31)

Quelle est la différence en C++ ? Peuvent-ils être utilisés de manière interchangeable ?

104voto

Rob Walker Points 25840

Il dépend de la mise en œuvre.

Par exemple, sous Windows, ils sont identiques, mais sur les systèmes Alpha, un long était de 64 bits alors qu'un int était de 32 bits. Ceci article couvre les règles pour le compilateur Intel C++ sur les plateformes variables. Pour résumer :

  OS           arch           size
Windows       IA-32        4 bytes
Windows       Intel 64     4 bytes
Windows       IA-64        4 bytes
Linux         IA-32        4 bytes
Linux         Intel 64     8 bytes
Linux         IA-64        8 bytes
Mac OS X      IA-32        4 bytes
Mac OS X      Intel 64     8 bytes

81voto

Loki Astari Points 116129

Les seules garanties que vous avez sont :

sizeof(char) == 1
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

// FROM @KTC. The C++ standard also has:
sizeof(signed char)   == 1
sizeof(unsigned char) == 1

// NOTE: These size are not specified explicitly in the standard.
//       They are implied by the minimum/maximum values that MUST be supported
//       for the type. These limits are defined in limits.h
sizeof(short)     * CHAR_BIT >= 16
sizeof(int)       * CHAR_BIT >= 16
sizeof(long)      * CHAR_BIT >= 32
sizeof(long long) * CHAR_BIT >= 64
CHAR_BIT         >= 8   // Number of bits in a byte

Voir aussi : Est long garanti d'être au moins de 32 bits ?

13voto

Adrian Points 236

Lors de la compilation pour x64, la différence entre int et long se situe entre 0 et 4 octets, selon le compilateur que vous utilisez.

GCC utilise le modèle LP64, ce qui signifie que les ints sont de 32 bits mais que les longs sont de 64 bits en mode 64 bits.

MSVC, par exemple, utilise le modèle LLP64, ce qui signifie que les ints et les longs sont à 32 bits même en mode 64 bits.

12voto

Kevin Haines Points 867

El La spécification C++ elle-même (ancienne version mais suffisamment bonne pour cela) laisse cette question ouverte.

Il existe quatre types d'entiers signés : ' signed char ', ' short int ', ' int ', et ' long int '. Dans cette liste, chaque type fournit au moins autant de de stockage que ceux qui le précèdent dans la liste. Les ints simples ont la taille naturelle taille naturelle suggérée par l'architecture du l'environnement d'exécution* ;

[Note de bas de page : c'est-à-dire assez grand pour contenir toute valeur comprise entre INT_MIN et INT_MAX, telles qu'elles sont définies dans l en-tête <climits> . --- fin de la note de bas de page]

7voto

Comme le souligne Kevin Haines, les ints ont la taille naturelle suggérée par l'environnement d'exécution, qui doit s'inscrire dans les limites de INT_MIN et INT_MAX.

La norme C89 stipule que UINT_MAX devrait être au moins 2^16-1, USHRT_MAX 2^16-1 et ULONG_MAX 2^32-1 . Cela donne un nombre de bits d'au moins 16 pour short et int, et 32 pour long. Pour char, il est explicitement indiqué qu'il doit avoir au moins 8 bits ( CHAR_BIT ). Le C++ hérite de ces règles pour le fichier limits.h, donc en C++ nous avons les mêmes exigences fondamentales pour ces valeurs. Vous devez cependant no déduire de cela que int est au moins 2 byte. Théoriquement, char, int et long pourraient tous être d'un octet, auquel cas CHAR_BIT doit être d'au moins 32. N'oubliez pas que l'"octet" est toujours la taille d'un caractère, donc si le caractère est plus grand, un octet n'est plus seulement 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