Je passe de Java à C ++ et j'ai des questions sur le long
type de données. En Java, pour contenir un entier supérieur à 2 32 , vous écririez simplement long x;
. Cependant, en C ++, il semble que ce 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 qu'il existe des éléments tels que:
long double x;
etc.
Quelle est la différence entre tous ces différents types de données et ont-ils tous le même objectif?
c++
long-integer
1110101001
la source
la source
long long
pourrait être plus lent quelong
, ce qui pourrait être plus lent queint
.Réponses:
long
etlong int
sont identiques. Il en va de mêmelong long
pourlong long int
. Dans les deux cas, l'int
option est facultative.Quant à la différence entre les deux ensembles, la norme C ++ impose des plages minimales pour chacun, et c'est
long long
au moins aussi large quelong
.Les parties contrôlantes de la norme (C ++ 11, mais cela existe depuis longtemps) sont, d'une part
3.9.1 Fundamental types
, la section 2 (une section ultérieure donne des règles similaires pour les types intégraux non signés):Il y a aussi un tableau 9 dans
7.1.6.2 Simple type specifiers
, qui montre les "mappages" des spécificateurs aux types réels (montrant que leint
est facultatif), dont une section est montrée ci-dessous:Notez la distinction entre le spécificateur et le type. Le spécificateur est la façon dont vous dites au compilateur quel est le type, mais vous pouvez utiliser différents spécificateurs pour aboutir au même type.
Par conséquent,
long
en soi, ce n'est ni un type ni un modificateur comme le pose votre question, c'est simplement un spécificateur pour lelong int
type. Idem pourlong long
être un spécificateur pour lelong long int
type.Bien que la norme C ++ elle-même ne spécifie pas les plages minimales de types intégraux, elle cite C99, in
1.2 Normative references
, comme s'appliquant. Par conséquent, les plages minimales définies dansC99 5.2.4.2.1 Sizes of integer types <limits.h>
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 que adouble
et de fournir un surensemble de valeurs sur ce type (c'est- à- dire au moins ces valeurs, pas nécessairement plus de valeurs).la source
unsigned
etunsigned int
long
c'est au moins 32 bits (2 ^ 31-1 de chaque côté de zéro) etlong long
au moins 64 (2 ^ 63-1 de chaque côté).long double
est garanti d'avoir au moins la plage dedouble
, mais il peut être le même. Cela dépend de l'ordinateur. Certaines FPU ont une précision étendue; les puces x87 avaient une précision simple de 32 bits, une double précision de 64 bits et une précision étendue de 80 bits.Long et long int sont au moins 32 bits.
long long et long long int font au moins 64 bits. Vous devez utiliser un compilateur c99 ou mieux.
les longs doubles sont un peu bizarres. Recherchez-les sur Wikipedia pour plus de détails.
la source
long
est équivalent àlong int
, tout commeshort
est équivalent àshort int
. Along int
est un type intégral signé d' au moins 32 bits, tandis que along long
oulong long int
est un type intégral signé d' au moins 64 bits.Cela ne signifie pas nécessairement que a
long long
est plus large que along
. De nombreuses plates-formes / ABI utilisent leLP64
modèle - oùlong
(et les pointeurs) ont une largeur de 64 bits. Win64 utilise leLLP64
, oùlong
est toujours 32 bits etlong long
(et les pointeurs) ont une largeur de 64 bits.Il y a un bon résumé des modèles de données 64 bits ici .
long double
ne garantit pas grand-chose d'autre qu'il sera au moins aussi large qu'undouble
.la source
Cela semble déroutant car vous prenez
long
lui-même un type de données.long
n'est rien d'autre qu'un raccourcilong int
lorsque vous l'utilisez seul.long
est un modificateur, vous pouvez l'utiliserdouble
aussi aveclong double
.long
==long int
.Les deux prennent 4 octets.
la source
Historiquement, au début du temps C, lorsque les processeurs avaient une longueur de mot de 8 ou 16 bits,
int
c'était identique à aujourd'huishort
(16 bits). Dans un certain sens, int est un type de données plus abstraites quechar
,short
,long
oulong long
, comme vous ne pouvez pas être sûr de la largeur de bit.Lors de la définition,
int n;
vous pouvez traduire cela 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 traduisentint
en 64 bits. Donc, lorsque vous voulez que votre variable ait 32 bits et pas plus, mieux vaut utiliser unlong
type de données explicite .[Modifier:
#include <stdint.h>
semble être le bon moyen de garantir les largeurs de bit en utilisant les types int ## _ t, bien qu'il ne fasse pas encore partie de la norme.]la source
long
est garanti d'avoir au moins 32 bits. (Les normes peuvent changer dur.) Le projet actuel de C ++ 14 dit simplement: @CM "Les entiers simples ont la taille naturelle suggérée par l'architecture de l'environnement d'exécution, les autres types entiers signés sont fournis pour répondre à des besoins spéciaux" (section 3.9.1 ). Je n'ai trouvé aucun mot sur les relations de longueur des différents pouces en elle. __int32 ne fait pas vraiment partie de la norme, mais depuis C ++ 11, il existe des typedefs disponibles comme int_fast32_t ou int_least32_t disponibles pour vous obtenir exactement ce que vous voulez.char
était presque unanimement 8 bits,short
16 etlong
32;int
pourrait être 16 ou 32. Remarque pour certaines plates-formes (en particulier le 68000), les deux 16 bits et 32 bitsint
étaient assez communs, et en effet certains compilateurs avaient des options pour prendre en charge les deux. On s'attendait donc à ce que le code qui devait être portable soit utiliséshort
oulong
de préférenceint
.Alors qu'en Java a
long
est toujours 64 bits, en C ++ cela dépend de l'architecture de l'ordinateur et du système d'exploitation . Par exemple, unlong
est de 64 bits sur Linux et 32 bits sous Windows (ce qui a été fait pour maintenir en arrière-compatibilité, ce qui permet de compiler sans aucune modification sur Windows 64 bits programmes 32 bits).Il est considéré comme un bon style C ++ à éviter
short int long ...
et à utiliser à la place:Ceux-ci (
int*_t
) peuvent être utilisés après avoir inclus l'en-<cstdint>
tête.size_t
est dedans<stdlib.h>
.la source