Je passe de Java à C ++ et je me pose des questions sur le type de données long
. En Java, pour contenir un entier supérieur à 2 32 , vous écrivez 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 tous ces types de données et ont-ils tous le même objective?
long
et long int
sont identiques. Ainsi sont long long
et long long int
. Dans les deux cas, l’ int
est facultatif.
En ce qui concerne la différence entre les deux ensembles, le standard C ++ impose des plages minimales pour chacun, et cette long long
est au moins aussi long
.
Les parties contrôlantes 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é, short int, int, long int et long long int. Dans cette liste, chaque type fournit au moins autant de stockage que ceux qui le précèdent dans la liste.
Il y a aussi une table 9 dans 7.1.6.2 Simple type specifiers
, qui montre les “mappages” des spécificateurs aux types réels (montrant que l’ int
est optionnel), 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 est la manière dont vous indiquez au compilateur le type, mais vous pouvez utiliser différents spécificateurs pour vous retrouver au même type.
Par conséquent long
le long
de sa propre question n’est ni un type ni un modificateur tel que posé par votre question, c’est simplement un spécificateur pour le type long int
. Idem pour long long
être un spécificateur pour le type long long int
.
Bien que le standard C ++ lui-même ne spécifie pas les plages minimales de types intégraux, il 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
sont applicables.
En termes de long double
, c’est en fait une valeur à virgule flottante plutôt qu’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 (c’est- à- dire au moins ces valeurs, pas nécessairement plus de valeurs).
Long et long int ont au moins 32 bits.
long long et long long int font au moins 64 bits. Vous devez utiliser un compilateur c99 ou supérieur.
les doubles longues sont un peu bizarres. Recherchez-les sur Wikipedia pour plus de détails.
long
est équivalent à long int
, tout comme short
est équivalent à short int
. Un entier long int
est un type intégral signé d’ au moins 32 bits, tandis qu’un long long
ou long long int
est un type intégral signé d’ au moins 64 bits.
Cela ne signifie pas nécessairement que la long long
est plus long
que la long
. De nombreuses plates-formes / ABI utilisent le modèle LP64
– où la long
(et les pointeurs) sont de 64 bits. Win64 utilise le LLP64
, où la long
est toujours de 32 bits et la long long
(et les pointeurs) 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 sinon il sera au moins aussi large qu’un double
.
Cela semble déroutant car vous prenez long
comme type de données lui-même.
long
n’est rien d’autre que le raccourci pour long int
lorsque vous l’utilisez seul.
long
est un modificateur, vous pouvez l’utiliser avec double
aussi long double
.
long
== long int
.
Les deux prennent 4 octets.
Historiquement, au début des temps C, lorsque les processeurs avaient une longueur de mot de 8 ou 16 bits, int
était identique au short
aujourd’hui (16 bits). Dans un certain sens, int est un type de données plus abstrait que char
, short
, long
ou long long
, car vous ne pouvez pas être sûr de la largeur de bit.
Lors de la définition de int n;
vous pourriez traduire ceci par “donnez-moi le meilleur compromis 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 en 64 bits. Donc, lorsque vous voulez que votre variable ait 32 bits et pas plus, mieux vaut utiliser un long
explicite comme type de données.
[Edit: #include
semble être le bon moyen de garantir les largeurs de bits à l’aide des types int ## _ t, bien que cela ne fasse pas encore partie du standard.]