Korrigieren Sie mich, wenn ich falsch liege,
int ist 4 Bytes mit einem Wertebereich von -2.147.483.648 bis 2.147.483.647 (2 ^ 31)
lang ist 4 Bytes mit einem Wertebereich von -2.147.483.648 bis 2.147.483.647 (2 ^ 31)
Was ist der Unterschied in C ++? Können sie austauschbar verwendet werden?
#include <stdint.h>
und dann die Typen , die die Größe sagen. ZBuint32_t
. Auf einer neuen Plattform müssen Sie nur sicherstellen, dass stdint.h für diese bestimmte Plattform richtig ist und Ihr Code wie beabsichtigt funktioniert.Antworten:
Es ist implementierungsabhängig.
Unter Windows sind sie beispielsweise gleich, aber auf Alpha-Systemen betrug ein Long 64 Bit, während ein Int 32 Bit betrug. Dieser Artikel behandelt die Regeln für den Intel C ++ - Compiler auf variablen Plattformen. Zusammenfassen:
quelle
Die einzige Garantie, die Sie haben, sind:
Siehe auch: Ist
long
garantiert mindestens 32 Bit?quelle
Beim Kompilieren für x64 liegt der Unterschied zwischen int und long zwischen 0 und 4 Byte, je nachdem, welchen Compiler Sie verwenden.
GCC verwendet das LP64-Modell, was bedeutet, dass Ints 32-Bit sind, Longs jedoch 64-Bit im 64-Bit-Modus.
MSVC verwendet beispielsweise das LLP64-Modell, was bedeutet, dass sowohl Ints als auch Longs auch im 64-Bit-Modus 32-Bit sind.
quelle
Die C ++ - Spezifikation selbst (alte Version, aber gut genug dafür) lässt dies offen.
quelle
Wie Kevin Haines betont, haben Ints die natürliche Größe, die von der Ausführungsumgebung vorgeschlagen wird und die in INT_MIN und INT_MAX passen muss.
Der C89-Standard besagt, dass
UINT_MAX
mindestens 2 ^ 16-1,USHRT_MAX
2 ^ 16-1 undULONG_MAX
2 ^ 32-1 sein sollten. Das ergibt eine Bitanzahl von mindestens 16 für kurz und int und 32 für lang. Für char heißt es ausdrücklich, dass es mindestens 8 Bits (CHAR_BIT
) haben sollte. C ++ erbt diese Regeln für die Datei limit.h, daher haben wir in C ++ dieselben grundlegenden Anforderungen für diese Werte. Sie sollten jedoch nicht daraus ableiten, dass int mindestens 2 Byte beträgt. Theoretisch könnten char, int und long alle 1 Byte sein. In diesem FallCHAR_BIT
muss es mindestens 32 sein. Denken Sie daran, dass "Byte" immer die Größe eines Zeichens hat. Wenn also char größer ist, besteht ein Byte nicht nur aus 8 Bits Mehr.quelle
byte
Datentyp in C ++ existiert. Das tut es nicht, oder? Wenn dies der Fall ist und abyte
andere Größen als 8 Bit haben kann, ist es einfach nur dumm. Warum würden sie es ein Byte nennen, wenn es nicht unbedingt 8 Bit ist?Das hängt von Ihrem Compiler ab. Es ist garantiert, dass ein Long mindestens so groß wie ein Int ist, aber Sie können nicht garantieren, dass es länger ist.
quelle
Die Anzahl der Bytes und der Wertebereich werden größtenteils von der Architektur der CPU bestimmt, nicht von C ++. C ++ legt jedoch Mindestanforderungen fest, die litb richtig erklärt hat und mit denen Martin York nur wenige Fehler gemacht hat.
Der Grund, warum Sie int und long nicht austauschbar verwenden können, ist, dass sie nicht immer gleich lang sind. C wurde auf einem PDP-11 erfunden, bei dem ein Byte 8 Bits hatte, int zwei Bytes betrug und direkt durch Hardwareanweisungen verarbeitet werden konnte. Da C-Programmierer häufig eine Vier-Byte-Arithmetik benötigten, wurde long erfunden und es waren vier Bytes, die von Bibliotheksfunktionen verarbeitet wurden. Andere Maschinen hatten andere Spezifikationen. Der C-Standard stellte einige Mindestanforderungen.
quelle
Wenn Sie sich darauf verlassen, dass der Compiler-Hersteller primitive Typgrößen implementiert, werden Sie wieder verfolgt, wenn Sie Ihren Code jemals auf einer anderen Maschinenarchitektur, einem anderen Betriebssystem oder einem anderen Compiler eines anderen Herstellers kompilieren.
Die meisten Compiler-Anbieter stellen eine Header-Datei bereit, die primitive Typen mit expliziten Typgrößen definiert. Diese primitiven Typen sollten immer dann verwendet werden, wenn Code möglicherweise auf einen anderen Compiler portiert wird (lesen Sie dies IMMER in JEDER Instanz). Zum Beispiel haben die meisten UNIX-Compiler
int8_t uint8_t int16_t int32_t uint32_t
. Microsoft hatINT8 UINT8 INT16 UINT16 INT32 UINT32
. Ich bevorzuge Borland / CodeGear'sint8 uint8 int16 uint16 int32 uint32
. Diese Namen erinnern auch ein wenig an die Größe / den Bereich des beabsichtigten Werts.Seit Jahren verwende ich Borlands explizite primitive Typnamen und
#include
die folgende C / C ++ - Headerdatei (primitive.h), mit der die expliziten primitiven Typen mit diesen Namen für jeden C / C ++ - Compiler definiert werden sollen (diese Headerdatei deckt möglicherweise nicht alle ab Compiler, aber es deckt mehrere Compiler ab, die ich unter Windows, UNIX und Linux verwendet habe. Es definiert (noch) keine 64-Bit-Typen.quelle
Der C ++ Standard sagt es so:
3.9.1, §2:
Das Fazit: Es kommt darauf an, an welcher Architektur Sie arbeiten. Jede andere Annahme ist falsch.
quelle