Was ist der Unterschied zwischen "long", "long long", "long int" und "long long int" in C ++?

209

Ich wechsle von Java zu C ++ und habe einige Fragen zum longDatentyp. Wenn Sie in Java eine Ganzzahl größer als 2 32 halten möchten, schreiben Sie einfach long x;. In C ++ scheint dies longjedoch sowohl ein Datentyp als auch ein Modifikator zu sein.

Es scheint verschiedene Möglichkeiten zu geben long:

long x;
long long x;
long int x;
long long int x;

Es scheint auch Dinge zu geben wie:

long double x;

und so weiter.

Was ist der Unterschied zwischen all diesen verschiedenen Datentypen und haben sie alle den gleichen Zweck?

1110101001
quelle
2
@ user2612743 - Um sicher zu gehen, denken Sie über Ihre Anforderungen nach und verwenden Sie den entsprechenden Typ. long longkönnte langsamer sein als long, was langsamer sein könnte als int.
Pete Becker
1
Nein, "um sicher zu sein, benutze lange lange" ist das gleiche wie zu sagen "um sicher zu sein, gib einfach jedem ein Erd-AIDS, damit wir uns keine Sorgen um sicheren Sex machen müssen, wir haben es sowieso alle schon!" Dumm, nein? Denken Sie über die Daten und die möglichen Werte nach und verwenden Sie den am besten passenden Typ. Dies hilft dem Compiler auch dabei, zusätzliche Optimierungen vorzunehmen, ohne die ursprüngliche Codeabsicht zu verletzen, z. B. wenn zusätzliche Bibliotheken geladen werden müssen, um Zahlen zu verarbeiten, die größer als die natürliche Bitbreite der Zielplattform sind.
CM
Die Verwendung von Long Long mit Win32-Listboxen und dergleichen führt nicht zu Chaos mit Ihrem Speicher und anderen Variablen - auch wenn die Grenzwerte nicht überschritten werden. Selbst mit den harmlos aussehenden C4244-Warnungen ist es nicht leicht zu erkennen.
Laurie Stearn

Antworten:

182

longund long intsind identisch. So sind long longund long long int. In beiden Fällen ist das intoptional.

In Bezug auf den Unterschied zwischen den beiden Sätzen schreibt der C ++ - Standard Mindestbereiche für jeden Satz vor, und dieser long longist mindestens so breit wie long.

Die steuernden Teile des Standards (C ++ 11, aber das gibt es schon lange) sind zum einen 3.9.1 Fundamental typesAbschnitt 2 (ein späterer Abschnitt enthält ähnliche Regeln für die vorzeichenlosen Integraltypen):

Es gibt fünf standardmäßige vorzeichenbehaftete Ganzzahltypen: signiertes Zeichen, kurzes int, int, langes int und langes langes int. In dieser Liste bietet jeder Typ mindestens so viel Speicherplatz wie die vorhergehenden in der Liste.

Es gibt auch eine Tabelle 9 in 7.1.6.2 Simple type specifiers, die die "Zuordnungen" der Spezifizierer zu tatsächlichen Typen zeigt (was zeigt, dass das intoptional ist), von denen ein Abschnitt unten gezeigt wird:

Specifier(s)         Type
-------------    -------------
long long int    long long int
long long        long long int
long int         long int
long             long int

Beachten Sie dort den Unterschied zwischen dem Bezeichner und dem Typ. Mit dem Bezeichner teilen Sie dem Compiler mit, um welchen Typ es sich handelt. Sie können jedoch verschiedene Bezeichner verwenden, um zum selben Typ zu gelangen.

Daher longist es für sich genommen weder ein Typ noch ein Modifikator, wie Ihre Frage besagt, sondern lediglich ein Spezifizierer für den long intTyp. Das Gleiche gilt für long longdie Angabe des long long intTyps.

Obwohl der C ++ - Standard selbst nicht die Mindestbereiche integraler Typen angibt, wird C99 in 1.2 Normative referencesals zutreffend angegeben. Daher gelten die in angegebenen C99 5.2.4.2.1 Sizes of integer types <limits.h>Mindestbereiche.


In Bezug auf long doubledas ist das eigentlich eher ein Gleitkommawert als eine ganze Zahl. Ähnlich wie bei den Integraltypen ist es erforderlich, mindestens so genau wie a zu sein doubleund eine Obermenge von Werten über diesen Typ bereitzustellen (dh mindestens diese Werte, nicht unbedingt mehr Werte).

paxdiablo
quelle
4
das gleiche mit unsignedundunsigned int
Kal
2
Ich bin mir ziemlich sicher, dass longes mindestens 32 Bit (2 ^ 31-1 auf beiden Seiten von Null) und long longmindestens 64 (2 ^ 63-1 auf beiden Seiten) ist.
Chris
2
Und long doubleist garantiert mindestens die Reichweite von double, aber es kann das gleiche sein. Das hängt vom Computer ab. Einige FPUs haben eine erweiterte Präzision. Die x87-Chips hatten eine einfache Genauigkeit von 32 Bit, eine doppelte Genauigkeit von 64 Bit und eine erweiterte Genauigkeit von 80 Bit.
Eric Jablow
In Bezug auf die Bereichsanforderungen verweist der C ++ 11-Standard auf den C11-Standard, der tatsächliche Bereiche aufweist.
Chris
Der "int" -Teil unterscheidet einfach zwischen einem Integer-Typ und einem Gleitkomma-, Zeichen- oder anderen Nicht-Integer-Typ. In vielen Fällen kann dies vom Compiler abgeleitet werden, sodass es gelöscht werden kann. Aus diesem Grund ist "unsigned" beispielsweise dasselbe wie "unsigned int". Der "int" -Teil wird einfach angenommen, es sei denn, der Programmierer gibt etwas anderes an, wie "char" oder "double". Was die tatsächlich verwendeten Größen betrifft. Abhängig davon, welchen Standard Sie lesen, kann jede Größe eine minimale Anzahl von Bits haben, aber sie sind alle so definiert, dass jede mindestens so groß ist wie der vorherige Typ.
CM
64

Long und Long Int sind mindestens 32 Bit.

long long und long long int sind mindestens 64 Bit. Sie müssen einen c99-Compiler oder besser verwenden.

lange Doppel sind etwas seltsam. Weitere Informationen finden Sie auf Wikipedia.

Eric Lippert
quelle
17

longist äquivalent zu long int, genauso wie shortäquivalent zu short int. A long intist ein vorzeichenbehafteter Integraltyp mit mindestens 32 Bit, während a long longoder long long intein vorzeichenbehafteter Integraltyp mindestens 64 Bit beträgt .

Dies bedeutet nicht unbedingt, dass a long longbreiter als a ist long. Viele Plattformen / ABIs verwenden das LP64Modell - wobei long(und Zeiger) 64 Bit breit sind. Win64 verwendet das LLP64, wobei longnoch 32 Bit vorhanden sind und long long(und Zeiger) 64 Bit breit sind.

Es gibt eine gute Zusammenfassung der 64-Bit - Datenmodelle hier .

long doublegarantiert nicht viel anderes als es wird mindestens so breit wie ein double.

Brett Hale
quelle
7

Dies sieht verwirrend aus, da Sie longselbst einen Datentyp verwenden.

longist nichts anderes als die Abkürzung, long intwenn Sie es alleine verwenden.

longist ein Modifikator, den Sie auch mit doubleals verwenden können long double.

long== long int.

Beide benötigen 4 Bytes.

Siraj Alam
quelle
Lange 4 Bytes sind nur unter Win64 gültig, es ist plattformabhängig
Prodigle
1
Ja natürlich ... nicht nur lang ... int benötigt 4 Bytes und 2 Bytes hängen zweifellos von der Plattform ab.
Siraj Alam
3

Historisch gesehen war in frühen C-Zeiten, als Prozessoren eine Wortlänge von 8 oder 16 Bit hatten, intidentisch mit den heutigen short(16 Bit). In einem gewissen Sinne, int ist ein abstrakter Datentyp als char, short, longoder long long, wie Sie sich nicht sicher über die Bitbreite sein können.

Bei der Definition können int n;Sie dies mit "Geben Sie mir den besten Kompromiss zwischen Bitbreite und Geschwindigkeit auf diesem Computer für n" übersetzen. Vielleicht sollten Sie in Zukunft erwarten, dass Compiler int64-Bit übersetzen. Wenn Ihre Variable also 32 Bit und nicht mehr haben soll, verwenden Sie besser einen expliziten longDatentyp.

[Bearbeiten: #include <stdint.h>scheint der richtige Weg zu sein, um Bitbreiten mit den Typen int ## _ t sicherzustellen, obwohl dies noch nicht Teil des Standards ist.]

Thomiel
quelle
2
Dieser letzte Teil, bei dem ein "long" verwendet wird, um 32-Bit zu erhalten, wenn int 64-Bit ist, ist falsch. Wenn int 64-Bit ist, ist long ebenfalls mindestens 64-Bit. Long ist garantiert mindestens so groß wie int, obwohl es größer sein kann, aber niemals kleiner. Die meisten Compiler verfügen über verschiedene Methoden, mit denen der Programmierer spezifischer arbeiten kann, z. B. einen (nicht portierbaren) __int32-Typ mit genau 32 Bit und so weiter.
CM
1
Wie im C-Standard definiert, longbeträgt a garantiert mindestens 32 Bit. (Standards können sich stark ändern.) Im aktuellen C ++ 14-Entwurf heißt es nur: @CM "Einfache Ints haben die natürliche Größe, die durch die Architektur der Ausführungsumgebung vorgeschlagen wird. Die anderen vorzeichenbehafteten Integer-Typen werden bereitgestellt, um spezielle Anforderungen zu erfüllen" (Abschnitt 3.9.1 ). Ich fand kein Wort über die Längenverhältnisse verschiedener Ints darin. __int32 ist nicht wirklich Teil des Standards, aber seit C ++ 11 sind Typedefs wie int_fast32_t oder int_least32_t verfügbar, damit Sie genau das bekommen, was Sie wollen.
Thomiel
Ich würde sagen, dass bei Implementierungen für umprogrammierbare Mikrocomputer für allgemeine Zwecke im 20. Jahrhundert charfast einstimmig 8 Bit, short16 und long32 Bit vorhanden waren . intkönnte entweder 16 oder 32 sein. Hinweis: Für einige Plattformen (insbesondere die 68000) waren sowohl 16-Bit- als auch 32-Bit-Versionen intweit verbreitet, und tatsächlich hatten einige Compiler Optionen zur Unterstützung. Es wurde daher erwartet, dass Code, der portabel sein musste, verwendet wird shortoder longbevorzugt wird int.
Supercat
0

Während in Java a long immer 64 Bit ist, hängt dies in C ++ von der Computerarchitektur und dem Betriebssystem ab . Beispielsweise ist a longunter Linux 64 Bit und unter Windows 32 Bit (dies wurde durchgeführt, um die Abwärtskompatibilität zu gewährleisten, sodass 32-Bit-Programme unter 64-Bit-Windows ohne Änderungen kompiliert werden können).

Es wird als guter C ++ - Stil angesehen, um dies zu vermeiden short int long ... und stattdessen zu verwenden:

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

Diese ( int*_t) können nach dem <cstdint>Einfügen des Headers verwendet werden. size_tist in <stdlib.h>.

xjcl
quelle