Ik ga over van Java naar C++ en heb wat vragen over het long
gegevenstype. Om in Java een geheel getal groter dan 232 vast te houden, schrijft u gewoon long x;
. In C++ lijkt het er echter op dat long
zowel een gegevenstype als een modifier is.
Er lijken verschillende manieren te zijn om long
te gebruiken:
long x;
long long x;
long int x;
long long int x;
Het lijkt er ook op dat er dingen zijn zoals:
long double x;
en ga zo maar door.
Wat is het verschil tussen al deze verschillende gegevenstypen en hebben ze allemaal hetzelfde doel?
Antwoord 1, autoriteit 100%
long
en long int
zijn identiek. Dat geldt ook voor long long
en long long int
. In beide gevallen is de int
optioneel.
Wat het verschil tussen de twee sets betreft, schrijft de C++-standaard voor elk een minimumbereik voor, en dat long long
minstens minstens zo breed is als long
.
De controlerende delen van de standaard (C++11, maar deze bestaat al heel lang) zijn bijvoorbeeld 3.9.1 Fundamental types
, sectie 2 (een latere sectie geeft soortgelijke regels voor de niet-ondertekende integraaltypen):
Er zijn vijf standaard typen integers met teken: ondertekend char, short int, int, long int en long long int. In deze lijst biedt elk type minstens zoveel opslagruimte als de voorgaande in de lijst.
Er is ook een tabel 9 in 7.1.6.2 Simple type specifiers
, die de “toewijzingen” van de specificaties aan de werkelijke typen toont (wat aantoont dat de int
optioneel is) , waarvan een gedeelte hieronder wordt getoond:
Specifier(s) Type
------------- -------------
long long int long long int
long long long long int
long int long int
long long int
Let op het onderscheid daar tussen de specificatie en het type. De specificeerder is hoe je de compiler vertelt wat het type is, maar je kunt verschillende specificeerders gebruiken om bij hetzelfde type uit te komen.
Daarom is long
op zichzelf noch een type noch een modifier, zoals je vraag stelt, het is gewoon een specificatie voor het type long int
. Idem voor long long
als specificatie voor het type long long int
.
Hoewel de C++-standaard zelf niet de minimumbereiken van integrale typen specificeert, citeert hij wel C99, in 1.2 Normative references
, als van toepassing. Daarom zijn de minimale bereiken zoals uiteengezet in C99 5.2.4.2.1 Sizes of integer types <limits.h>
van toepassing.
In termen van long double
is dat eigenlijk een drijvende-kommawaarde in plaats van een geheel getal. Net als bij de integrale typen, is het vereist om ten minste net zoveel precisie te hebben als een double
en om een superset van waarden over dat type te bieden (wat betekent ten minste die waarden, niet noodzakelijkerwijs meer waarden).
Antwoord 2, autoriteit 31%
Lange en lange int zijn minimaal 32 bits.
long long en long long int zijn minimaal 64 bits. U moet een c99-compiler of beter gebruiken.
lange doubles zijn een beetje vreemd. Zoek ze op Wikipedia op voor details.
Antwoord 3, autoriteit 10%
long
is gelijk aan long int
, net zoals short
gelijk is aan short int
. Een long int
is een ondertekend integraal type dat minstens 32 bits is, terwijl een long long
of long long int
is een ondertekend integraal type is minstens 64 bits.
Dit betekent niet noodzakelijk dat een long long
breder is dan een long
. Veel platforms / ABI’s gebruiken het LP64
-model – waarbij long
(en pointers) 64 bits breed zijn. Win64 gebruikt de LLP64
, waarbij long
nog steeds 32 bits is, en long long
(en pointers) 64 bits breed zijn.
Er is hier een goed overzicht van 64-bits gegevensmodellen.
long double
garandeert niet veel anders dan dat het minstens zo breed zal zijn als een double
.
Antwoord 4, autoriteit 5%
Dit ziet er verwarrend uit omdat je zelf long
gebruikt als datatype.
long
is niets anders dan de afkorting voor long int
als je het alleen gebruikt.
long
is een modifier, je kunt het met double
ook gebruiken als long double
.
long
== long int
.
Beide nemen 4 bytes in beslag.
Antwoord 5
Historisch gezien, in de vroege C-tijden, toen processors een woordlengte van 8 of 16 bits hadden, was int
identiek aan de huidige short
(16 bit). Int is in zekere zin een abstracter gegevenstype danchar
,short
,long
oflong long
, omdat je niet zeker bent van de bitbreedte.
Bij het definiëren vanint n;
zou je dit kunnen vertalen met “geef me het beste compromis van bitbreedte en snelheid op deze machine voor n”. Misschien moet je in de toekomst verwachten dat compilersint
vertalen naar 64 bits. Dus als u wilt dat uw variabele 32 bits heeft en niet meer, kunt u beter een explicietlong
als gegevenstype gebruiken.
[Edit: #include <stdint.h>
lijkt de juiste manier te zijn om bitbreedten te garanderen met behulp van de int##_t-types, hoewel het nog geen deel uitmaakt van de standaard.]
Antwoord 6
Terwijl in Java een long
altijd 64 bits is, is dit in C++ afhankelijk van de computerarchitectuur en het besturingssysteem. Een long
is bijvoorbeeld 64 bits op Linux en 32 bits op Windows (dit werd gedaan om de achterwaartse compatibiliteit te behouden, waardoor 32-bits programma’s zonder enige wijzigingen op 64-bits Windows konden worden gecompileerd).
Het wordt als een goede C++-stijl beschouwd om vermijden short int long ...
en in plaats daarvan:
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
Deze (int*_t
) kunnen worden gebruikt nadat de kop <cstdint>
is toegevoegd. size_t
staat in <stdlib.h>
.
Antwoord 7
Er is geen afwijking, (long long x ) is gelijk aan (long long int x ), maar de tweede bevestigt dat variabele x een geheel getal is