295 votes

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 à C++ et j'ai quelques questions à propos de l'utilisation de l'interface utilisateur. long type de données. En Java, pour contenir un entier supérieur à 2 32 il suffit d'écrire long x; . Cependant, en C++, il semble que long est à la fois un type de données et un modificateur.

Il semble qu'il y ait plusieurs façons d'utiliser long :

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

En outre, il semble qu'il y ait des choses telles que :

long double x;

et ainsi de suite.

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

256voto

paxdiablo Points 341644

long y long int sont identiques. Il en est de même pour les long long y long long int . Dans les deux cas, le int est facultatif.

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

Les éléments de contrôle de la norme (C++11, mais cela existe depuis longtemps) sont, pour commencer, les suivants, 3.9.1 Fundamental types , section 2 (une section ultérieure donne des règles similaires pour les types d'intégrales non signées) :

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

Il y a également un tableau 9 dans 7.1.6.2 Simple type specifiers qui montre les "correspondances" entre les spécificateurs et les types réels (en montrant que le type int est facultatif), dont une partie est présenté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 est la façon dont vous indiquez au compilateur quel est le type, mais vous pouvez utiliser différents spécificateurs pour aboutir au même type.

D'où long n'est pas un type ni un modificateur comme le suppose votre question, il s'agit simplement d'un spécificateur pour le long int type. Il en va de même pour les long long étant un spécificateur pour le long long int type.

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


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

80voto

Eric Lippert Points 300275

Long et long int ont au moins 32 bits.

long long et long long int ont au moins 64 bits. Vous devez utiliser un compilateur c99 ou mieux.

Les doubles longs sont un peu bizarres. Pour en savoir plus, consultez Wikipédia.

31voto

Brett Hale Points 9724

long est équivalent à long int tout comme short est équivalent à short int . A long int est un type d'intégrale signée qui est au moins 32 bits, tandis qu'un long long o long long int est un type d'intégrale signée 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 / ABIs utilisent l'option LP64 modèle - où long (et les pointeurs) ont une largeur de 64 bits. Win64 utilise le format LLP64 donde long est toujours de 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 aquí .

long double ne garantit pas grand-chose, si ce n'est qu'il sera au moins aussi large qu'un double .

18voto

xjcl Points 608

Alors qu'en Java, un long est toujours de 64 bits, en C++ c'est dépend de l'architecture de l'ordinateur et du système d'exploitation . Par exemple, un long est de 64 bits sous Linux et de 32 bits sous Windows (ceci a été pour maintenir la compatibilité ascendante qui permet aux programmes 32 bits de compiler sur Windows 64 bits sans aucune modification). long int est un synonyme de long .

Plus tard, long long a été introduit pour signifier "long (64 bits) sur Windows pour de vrai cette fois". long long int est un synonyme de cela.

Il est considéré comme un bon style C++ à éviter short , int , long etc. et utiliser à la place :

std::int8_t   # exactly  8 bits
std::int16_t  # exactly 16 bits
std::int32_t  # exactly 32 bits
std::int64_t  # exactly 64 bits

std::size_t   # can hold all possible object sizes, used for indexing

Vous pouvez utiliser ces int*_t en incluant le <cstdint> l'en-tête. size_t est en <stdlib.h> .

12voto

Siraj Points 1372

Cela peut prêter à confusion, car vous prenez long en tant que type de données.

long n'est rien d'autre que l'abréviation de long int lorsque vous l'utilisez seul.

long est un modificateur, vous pouvez l'utiliser avec double également en tant que long double .

long == long int .

Tous deux prennent 4 octets.

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