Quel est le "long" type de données utilisées pour?
J'ai été à la programmation en C++ pour un bon moment maintenant et je suis assez familier avec la plupart des choses. Une chose que je n'ai jamais compris c'est que le "long" type de données.
Je l'ai googlé mais je ne sais toujours pas ce que c'est. J'ai trouvé des pages qui disent que c'est de la même taille et a la même gamme que d'un int. Alors, quel serait l'intérêt pour l'utiliser?
J'ai trouvé un autre débordement de pile question à ce sujet ici:
Différence entre les longues et les types de données int
Et il semble que la seule différence entre les deux est que, parfois, la taille est différente sur les différents systèmes. Est-ce à dire qu'une application qui utilise de long sur une machine 64 bits ne fonctionne pas sur une machine 32 bits? Si oui, alors ne serait-il pas préférable de ne pas les utiliser du tout?
Aussi, j'ai remarqué des trucs appelé "long int" ou encore "long long"! Est-il un type de données ou un modificateur?
Je l'utilise généralement pour stocker des valeurs monétaires, par exemple, de longues myMoney; // oui mon argent looonnnnggg
long long est dans le prochain standard autant que je sache
correct -- c'est pourquoi ma phrase a été écrite au présent et non au futur.
Serait le nouveau mot-clé "très"?
OriginalL'auteur Alex | 2010-12-01
Vous devez vous connecter pour publier un commentaire.
Il est dépendant du compilateur. Mes normes-fu est un peu rouillé, mais je crois qu'il est défini comme suit:
où:
Ce qui signifie qu'il est parfaitement valable d'avoir
char = short = int = long = long long = 64bits
et, en fait, les compilateurs de certains Dsp sont conçues de cette manière., Ce qui souligne l'importance de la lecture de votre documentation du compilateur.
Pouvez-vous citer où dans la norme, il l'a dit? J'ai vu des compilateurs dans la vie réelle où le char est en 32 et 64 bits. Ou peut-être que c'est juste du C et pas du C++.
c'est une mauvaise correction. la taille de
char
en bits est donnée par ex.CHAR_BIT
de<limits.h>
. il doit >= 8.Presque,
sizeof(char) == 1
maisCHAR_BIT
peut avoir un nombre arbitraire. La seule exigence est que va contenir l'ensemble du jeu de caractères de base pour la plate-forme.Je crois
long
est un modificateur deint
qui impliqueint
de sorte que leint
mot clé est facultatif. Certaines personnes préfèrent il y à préciser que nous avons affaire avec des entiers, pas des flotteurs.OriginalL'auteur slebetman
long int
est le même quelong
(tout commeshort int
est le même queshort
).long long
est un type de données distinct présenté par plusieurs compilateurs et adopté par le C++0x.Noter qu'il n'y a pas une telle chose comme
long long long
:OriginalL'auteur fredoverflow
À partir de l'une des réponses à la question que vous avez lié:
Je ne peux pas penser à une meilleure façon de l'expliquer.
OriginalL'auteur Nate
long
est garanti (au moins) de 32 bits.int
n'est garantie (au moins) de 16 bits. sur de 16 et 8 bits des systèmeslong
fourni de gamme à un coût de l'efficacité.cheers & hth.,
dans la norme C, le C++ standard se réfère. Hth.,
La norme C++ se réfère à la norme C? Qui C standard? Ce sont des nouvelles de moi... j'ai lu le C++03 standard, et je n'ai jamais été appelé à la norme (je n'en ai pas).
l'actuelle norme C++ C++98, avec les corrections d'erreurs de Rectificatif Technique 1, connu sous le nom C++03. Depuis 1998, vient avant 1999, vous pouvez facilement en déduire que l'actuelle norme C++ ne fait pas référence à C99. Par conséquent, il se réfère?
C++03 §3.9, note de bas de page 37 dit, "L'intention est que le modèle de mémoire de C++ est compatible avec celui de la norme ISO/IEC 9899 Langage de Programmation C." Cela implique que toutes les déclarations concernant POD types ont une base en C89. Il se réfère également à
<climits>
dans la note de bas de page 39 §3.9.1 pour cette définition. Je n'ai pas de copie de C89, mais C99 §5.2.4.2.1 ditlong
doit être capable de tenir au moins un entier de 32 bits. Par conséquent,long
est garantie au moins 32-bits. CQFD.OriginalL'auteur Cheers and hth. - Alf
C'est ce que le C++03 standard dit (3.9.1/2) :
Donc :
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
C'est ce que le C++0x (3.9.1/2) et C99 (6.2.5/4) normes de dire :
long
est synonyme delong int
long long
n'existe pas en C++03, mais en C++0x.OriginalL'auteur icecrime
Je me suis demandé la même chose. Et a conclu que
long
est désormais inutile.Avant la naissance des systèmes 64 bits, le de facto standard pour C les types d'entiers est:
char
= (u
)int8_t
(A noter que C est antérieure à Unicode.)short
=int16_t
int
=intptr_t
[jusqu'à 64-bit],int_fast16_t
long
=int32_t
[jusqu'à 64-bit],intmax_t
[jusqu'en 1999]long long
=int64_t
ouintmax_t
Aujourd'hui, cependant,
long
n'a pas de cohérence sémantique.OriginalL'auteur dan04
Si vous voulez un entier qui est garanti pour être 32 bits ou 64 bits, il y a de tels types, par exemple int64_t. Si vous voulez vraiment vous assurer que votre int sont de taille, l'utilisation de ces types au lieu de le long, long long, etc. Vous aurez besoin d'inclure
cstdint
pour ces (stdint.h en C).int64_t
est malheureusement pas suffisant pour s'assurer du code portable. Compte tenu deuint16_t ffff16=0xFFFF; int64_t whoknows=ffff16*ffff16;
est requis pour un rendement de 1 sur les machines oùint
est de 16 bits et 4294836225 sur les machines où il est de 33 bits ou plus. Sur les machines oùint
est une taille intermédiaire, il sera généralement le rendement -131071, mais à partir de ma compréhension de compilateurs pour les machines 32 bits, pourraient faire ce qu'ils voulaient car la multiplication serait de débordement.OriginalL'auteur pythonic metaphor