web-dev-qa-db-fra.com

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

Je suis en train de passer de Java au C++ et j'ai quelques questions à propos du type de données long. En Java, contenir un entier supérieur à 232, vous écririez simplement long x;. Cependant, en C++, il semble que long soit à la fois un type de données et un modificateur.

Il semble y avoir plusieurs façons d'utiliser long:

long x;
long long x;
long int x;
long long int x;

En outre, il semble y avoir des choses telles que:

long double x;

etc.

Quelle est la différence entre ces différents types de données et ont-ils le même objectif?

167
1110101001

long et long int sont identiques. De même que long long et long long int. Dans les deux cas, la int est facultative.

En ce qui concerne la différence entre les deux ensembles, la norme C++ impose des plages minimales pour chacun, et le long long est égal à le moins aussi large que long.

Les parties de contrôle de la norme (C++ 11, mais cela existe depuis longtemps) sont, pour un, 3.9.1 Fundamental types, section 2 (une section ultérieure donne des règles similaires pour les types intégraux non signés):

Il existe cinq types d'entiers signés standard: char signé, int court, int, long int et long long int. Dans cette liste, chaque type fournit au moins autant de mémoire que ceux qui le précèdent dans la liste.

Il y a aussi un tableau 9 dans 7.1.6.2 Simple type specifiers, qui montre les "mappages" des spécificateurs sur les types réels (montrant que le int est facultatif), dont une section est montrée ci-dessous:

Specifier(s)         Type
-------------    -------------
long long int    long long int
long long        long long int
long int         long int
long             long int

Notez la distinction entre le spécificateur et le type. Le spécificateur indique comment vous indiquez le type au compilateur, mais vous pouvez utiliser différents spécificateurs pour obtenir le même type.

Par conséquent, long n'est pas en lui-même un type ni un modificateur, comme le dit votre question, il s'agit simplement d'un spécificateur pour le type long int. Idem pour long long étant un spécificateur pour le type long long int.

Bien que la norme C++ elle-même ne spécifie pas les plages minimales des types intégraux, elle cite C99, dans 1.2 Normative references, comme s'appliquant. Par conséquent, les plages minimales définies dans C99 5.2.4.2.1 Sizes of integer types <limits.h> sont applicables.


En termes de long double, il s'agit en fait d'une valeur à virgule flottante plutôt que d'un entier. Comme pour les types intégraux, il est nécessaire d’avoir au moins autant de précision qu’un double et de fournir un sur-ensemble de valeurs sur ce type (ce qui signifie au moins ces valeurs, mais pas nécessairement - plus valeurs).

154
paxdiablo

Long et long int sont au moins 32 bits.

long long et long long int sont au moins 64 bits. Vous devez utiliser un compilateur c99 ou supérieur.

les doubles sont un peu bizarres. Consultez-les sur Wikipedia pour plus de détails.

51
Eric Lippert

long est équivalent à long int, tout comme short est équivalent à short int. Un long int est un type intégral signé ayant au moins au moins 32 bits, tandis qu'un long long ou long long int est un type intégral signé est au moins 64 bits.

Cela ne signifie pas nécessairement qu'un long long est plus large qu'un long. De nombreuses plates-formes/ABI utilisent le modèle LP64, où long (et les pointeurs) ont une largeur de 64 bits. Win64 utilise le LLP64, où long est toujours 32 bits et long long (et les pointeurs) ont une largeur de 64 bits.

Il existe un bon résumé des modèles de données 64 bits ici .

long double ne garantit pas grand chose d'autre que ce sera au moins aussi large qu'un double.

13
Brett Hale

Cela semble déroutant parce que vous prenez long comme un type de données lui-même.

long n'est qu'un raccourci pour long int lorsque vous l'utilisez seul.

long est un modificateur, vous pouvez l'utiliser avec double également comme long double.

long == long int.

Les deux prennent 4 octets.

7
Siraj Alam

Historiquement, au début des temps C, lorsque les processeurs avaient une longueur de mot de 8 ou 16 bits, int était identique à nos jours short (16 bits). Dans un certain sens, int est un type de données plus abstrait que char, short, longoulong long, car vous ne pouvez pas être sûr de la largeur de bit.

Lorsque vous définissezint n;vous pouvez traduire cela par "donnez-moi le meilleur compromis en termes de largeur de bit et de vitesse sur cette machine pour n". Peut-être qu’à l’avenir vous devriez vous attendre à ce que les compilateurs traduisent int 64 bits. Ainsi, lorsque vous voulez que votre variable ait 32 bits et pas plus, utilisez un type de données explicitlongas.

[Edit: #include <stdint.h> semble être le moyen approprié de garantir les largeurs de bits en utilisant les types int ## _ t, bien que cela ne fasse pas encore partie de la norme.]

3
thomiel