Dies ist ein Ergebnis der lockeren Natur von Größendefinitionen in den C- und C ++ - Sprachspezifikationen. Ich glaube, C hat bestimmte Mindestgrößen, aber die einzige Regel in C ++ ist dies:
%Vor% Außerdem sind sizeof(int)
und sizeof(long)
nicht auf allen Plattformen gleich groß. Jede 64-Bit-Plattform, mit der ich gearbeitet habe, hat long
an die natürliche Wortgröße angepasst, also 32 Bit an eine 32-Bit-Architektur und 64 Bit an eine 64-Bit-Architektur.
int
ist im Wesentlichen der bequemste und effizienteste Integertyp
long
ist / war der größte Integer-Typ
short
ist der kleinste Typ
Wenn der längste Integer-Typ auch der effizienteste ist, ist int
identisch mit long
. Vor einiger Zeit (denke Pre-32-Bit), sizeof(int) == sizeof(short)
auf einer Reihe von Plattformen seit 16-Bit war die breiteste natürliche Integer.
int soll die natürliche Wortgröße der Architektur sein. In den alten Tagen, auf 16-Bit-Maschinen wie dem ursprünglichen IBM-PC, waren Ints 16 Bit und Longs waren 32 Bit. Auf 32-Bit-Maschinen wie der 68000-Serie waren die Ints immer noch "die natürliche Wortgröße", die nun 32 Bit betrug, und die Longs blieben bei 32 Bit. Mit der Zeit wuchs die Long-Position auf 64 Bit, und dann begannen wir 64-Bit-Architekturen wie den Intel Core 2 zu verwenden, und ich erwarte, dass Int früher oder später auf 64 Bit wächst.
Interessante Tatsache: Bei meinem Core 2 Duo und Mac OS X 10.5 sind Int und Long beide 32 Bit. Auf meiner Linux-Box, auch mit einem Core 2 Duo und Ubuntu, ist int 32 Bit lang und 64 Bit lang.
Vor Jahren wurde ich in einem Vorstellungsgespräch gefragt, wo ein int Zeiger wäre, nachdem du 3 hinzugefügt hast. Ich antwortete "3 mal sizeof (int) Vergangenheit wo es jetzt ist". Der Interviewer bedrängte mich, und ich sagte, es würde von der Architektur abhängen, da (damals) Windows 16-Bit-Ints verwendete, aber seit ich Unix-Programmierung machte, war ich eher an 32-Bit-Ints gewöhnt. Ich habe den Job nicht bekommen - ich vermute, dass der Interviewer die Tatsache nicht mochte, dass ich mehr wusste als er.
Wie Tom richtig sagte, ist die einzige Standardgröße in C ++ char, deren Größe 1 (*) ist. Von da an gilt zwischen den Typen nur noch eine Beziehung, die nicht kleiner als ist. Die meisten Leute werden behaupten, dass es von der Architektur abhängt, aber es ist eher eine Compiler- / OS-Entscheidung. Die gleiche Hardware, auf der MacOSX, Windows (32/64 Bit) oder Linux (32/64) laufen, hat unterschiedliche Größen für dieselben Datentypen. Verschiedene Compiler in derselben Architektur und OS können unterschiedliche Größen haben. Selbst der exakt gleiche Compiler auf demselben Betriebssystem auf derselben Hardware kann je nach Kompilierungsflag verschiedene Größen haben:
%Vor%Das ist das Ergebnis der Verwendung des gcc-Compilers auf MacOSX Leopard. Wie Sie sehen können, ist die Hardware und Software identisch und doch unterscheiden sich die Größen auf zwei ausführbaren Dateien, die aus demselben Code stammen.
Wenn Ihr Code von den Größen abhängt, sollten Sie nicht die Standardtypen verwenden, sondern spezielle Typen für Ihren Compiler, die die Größe explizit machen. Oder verwenden Sie einige portable Bibliotheken, die diese Unterstützung bieten, zum Beispiel mit ACE: ACE_UINT64 ist ein 64-Bit-Typ ohne Vorzeichen, unabhängig von der Compiler / OS / Architektur. Die Bibliothek erkennt den Compiler und die Umgebung und verwendet den entsprechenden Datentyp auf jeder Plattform.
(*) Ich habe den C ++ - Standard 3.9.1 erneut überprüft: Die Zeichengröße muss "groß genug sein, um alle Elemente des grundlegenden Zeichensatzes der Implementierung zu speichern". Später in: 5.3.3: sizeof (char), sizeof (vorzeichenbehaftetes Zeichen) und sizeof (vorzeichenloses Zeichen) sind 1 , also ja, die Größe eines Zeichens ist 1 Byte.
Nachdem ich andere Antworten gelesen hatte, fand ich eine, die besagt, dass bool der kleinste Integer-Typ ist. Wiederum ist der Standard in den Anforderungen lose und besagt nur, dass er true und false darstellen kann, aber nicht seine Größe. Der Standard ist insofern explizit: 5.3.3, Fußnote: "sizeof (bool) muss nicht 1 sein."
Beachten Sie, dass einige C ++ - Implementierungen aus anderen Gründen entschieden haben, Bools zu verwenden, die größer als 1 Byte sind. In Apple MacOSX PPC-Systemen mit gcc, sizeof(bool)==4
.
int
und long
haben nicht immer die gleiche Größe, also gehen Sie nicht davon aus, dass sie im Code sind. Historisch gab es 8 Bit und 16 Bit, sowie die bekannteren 32 Bit und 64 Bit Architekturen. Für eingebettete Systeme sind immer noch kleinere Wortgrößen üblich. Suchen Sie im Internet nach ILP32 und LP64 für viel zu viele Informationen.
Tags und Links c++