Ich wechsle von Java zu C ++ und habe einige Fragen zum long
Datentyp. Wenn Sie in Java eine Ganzzahl größer als 2 32 halten möchten, schreiben Sie einfach long x;
. In C ++ scheint dies long
jedoch 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?
c++
long-integer
1110101001
quelle
quelle
long long
könnte langsamer sein alslong
, was langsamer sein könnte alsint
.Antworten:
long
undlong int
sind identisch. So sindlong long
undlong long int
. In beiden Fällen ist dasint
optional.In Bezug auf den Unterschied zwischen den beiden Sätzen schreibt der C ++ - Standard Mindestbereiche für jeden Satz vor, und dieser
long long
ist mindestens so breit wielong
.Die steuernden Teile des Standards (C ++ 11, aber das gibt es schon lange) sind zum einen
3.9.1 Fundamental types
Abschnitt 2 (ein späterer Abschnitt enthält ähnliche Regeln für die vorzeichenlosen Integraltypen):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 dasint
optional ist), von denen ein Abschnitt unten gezeigt wird: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
long
ist es für sich genommen weder ein Typ noch ein Modifikator, wie Ihre Frage besagt, sondern lediglich ein Spezifizierer für denlong int
Typ. Das Gleiche gilt fürlong long
die Angabe deslong long int
Typs.Obwohl der C ++ - Standard selbst nicht die Mindestbereiche integraler Typen angibt, wird C99 in
1.2 Normative references
als zutreffend angegeben. Daher gelten die in angegebenenC99 5.2.4.2.1 Sizes of integer types <limits.h>
Mindestbereiche.In Bezug auf
long double
das ist das eigentlich eher ein Gleitkommawert als eine ganze Zahl. Ähnlich wie bei den Integraltypen ist es erforderlich, mindestens so genau wie a zu seindouble
und eine Obermenge von Werten über diesen Typ bereitzustellen (dh mindestens diese Werte, nicht unbedingt mehr Werte).quelle
unsigned
undunsigned int
long
es mindestens 32 Bit (2 ^ 31-1 auf beiden Seiten von Null) undlong long
mindestens 64 (2 ^ 63-1 auf beiden Seiten) ist.long double
ist garantiert mindestens die Reichweite vondouble
, 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.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.
quelle
long
ist äquivalent zulong int
, genauso wieshort
äquivalent zushort int
. Along int
ist ein vorzeichenbehafteter Integraltyp mit mindestens 32 Bit, während along long
oderlong long int
ein vorzeichenbehafteter Integraltyp mindestens 64 Bit beträgt .Dies bedeutet nicht unbedingt, dass a
long long
breiter als a istlong
. Viele Plattformen / ABIs verwenden dasLP64
Modell - wobeilong
(und Zeiger) 64 Bit breit sind. Win64 verwendet dasLLP64
, wobeilong
noch 32 Bit vorhanden sind undlong long
(und Zeiger) 64 Bit breit sind.Es gibt eine gute Zusammenfassung der 64-Bit - Datenmodelle hier .
long double
garantiert nicht viel anderes als es wird mindestens so breit wie eindouble
.quelle
Dies sieht verwirrend aus, da Sie
long
selbst einen Datentyp verwenden.long
ist nichts anderes als die Abkürzung,long int
wenn Sie es alleine verwenden.long
ist ein Modifikator, den Sie auch mitdouble
als verwenden könnenlong double
.long
==long int
.Beide benötigen 4 Bytes.
quelle
Historisch gesehen war in frühen C-Zeiten, als Prozessoren eine Wortlänge von 8 oder 16 Bit hatten,
int
identisch mit den heutigenshort
(16 Bit). In einem gewissen Sinne, int ist ein abstrakter Datentyp alschar
,short
,long
oderlong 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 Compilerint
64-Bit übersetzen. Wenn Ihre Variable also 32 Bit und nicht mehr haben soll, verwenden Sie besser einen explizitenlong
Datentyp.[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.]quelle
long
beträ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.char
fast einstimmig 8 Bit,short
16 undlong
32 Bit vorhanden waren .int
könnte entweder 16 oder 32 sein. Hinweis: Für einige Plattformen (insbesondere die 68000) waren sowohl 16-Bit- als auch 32-Bit-Versionenint
weit verbreitet, und tatsächlich hatten einige Compiler Optionen zur Unterstützung. Es wurde daher erwartet, dass Code, der portabel sein musste, verwendet wirdshort
oderlong
bevorzugt wirdint
.Während in Java a
long
immer 64 Bit ist, hängt dies in C ++ von der Computerarchitektur und dem Betriebssystem ab . Beispielsweise ist along
unter 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:Diese (
int*_t
) können nach dem<cstdint>
Einfügen des Headers verwendet werden.size_t
ist in<stdlib.h>
.quelle