Wat is het verschil tussen long , long long , long int en long long int in C++?

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,longoflong 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 compilersintvertalen naar 64 bits. Dus als u wilt dat uw variabele 32 bits heeft en niet meer, kunt u beter een explicietlongals 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

LEAVE A REPLY

Please enter your comment!
Please enter your name here

seven + twelve =

Other episodes