web-dev-qa-db-fra.com

Différence entre les types de données long et int

Étant donné que les instructions suivantes renvoient 4, quelle est la différence entre les types int et long en C++?

sizeof(int)
sizeof(long)
46
Alex

De this référence:

Un int était à l'origine destiné à être la taille de mot "naturelle" du processeur. De nombreux processeurs modernes peuvent gérer différentes tailles de mots avec la même facilité.

En outre, ce bit:

Sur de nombreuses (mais pas toutes) implémentations C et C++, un long est plus grand qu'un int. Les plates-formes de bureau les plus populaires d'aujourd'hui, telles que Windows et Linux, fonctionnent principalement sur des processeurs 32 bits et la plupart des compilateurs pour ces plates-formes utilisent un int 32 bits qui a la même taille et la même représentation qu'une longue.

53
Paul Sonier

Les garanties que la norme vous donne comme ceci:

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

Il est donc parfaitement valable que sizeof (int) et sizeof (long) soient égaux, et de nombreuses plates-formes choisissent de suivre cette approche. Vous trouverez des plates-formes où int est 32 bits, long est 64 bits et long long Est 128 bits, mais cela semble très courant pour sizeof (long) être 4.

(Notez que long long Est reconnu en C à partir de C99, mais était normalement implémenté en tant qu'extension en C++ avant C++ 11.)

42
Dan Olson

Vous êtes sur une machine 32 bits ou une machine Windows 64 bits. Sur ma machine 64 bits (exécutant un O/S dérivé d'Unix, pas Windows), sizeof(int) == 4, mais sizeof(long) == 8.

Ce sont des types différents - parfois de la même taille, parfois non.

(Dans les temps très anciens, sizeof(int) == 2 et sizeof(long) == 4 - bien que cela puisse avoir été les jours avant que C++ n'existe, pensez-y. Pourtant, techniquement, c'est une configuration légitime, quoique inhabituel en dehors de l'espace intégré, et très probablement inhabituel même dans l'espace intégré.)

17
Jonathan Leffler

Sur les plateformes où ils ont tous deux la même taille, la réponse est rien. Ils représentent tous les deux des valeurs signées sur 4 octets.

Cependant, vous ne pouvez pas dépendre que cela soit vrai. Les tailles long et int ne sont pas définitivement définies par la norme. Il est possible pour les compilateurs de donner aux types des tailles différentes et donc de casser cette hypothèse.

4
JaredPar

Le long doit être au moins de la même taille qu'un int et éventuellement, mais pas nécessairement, plus long.

Sur les systèmes 32 bits courants, int et long sont tous deux de 4 octets/32 bits, ce qui est valide selon la spécification C++.

Sur d'autres systèmes, int et long long peuvent avoir une taille différente. J'avais l'habitude de travailler sur une plateforme où int était de 2 octets et long de 4 octets.

3
abelenky

Une bonne pratique typique n'utilise pas directement long/int/short. Au lieu de cela, selon la spécification des compilateurs et du système d'exploitation, enveloppez-les dans un fichier d'en-tête pour vous assurer qu'ils contiennent exactement la quantité de bits que vous souhaitez. Utilisez ensuite int8/int16/int32 au lieu de long/int/short. Par exemple, sur Linux 32 bits, vous pouvez définir un en-tête comme celui-ci

typedef char int8;
typedef short int16;
typedef int int32;
typedef unsigned int uint32;
2
fwlx