Welches ist der größte Integer-Datentyp in C++?
Antworten
Zu viele Anzeigen?Die größte Standard Der C++ Ganzzahlentyp ist long
.
C hat eine long long
und C++0x wird das ebenfalls hinzufügen, und natürlich könnten Sie Ihren eigenen benutzerdefinierten Integer-Typ implementieren, vielleicht sogar eine BigInt-Klasse.
Aber technisch gesehen, wenn man die eingebauten Integer-Typen betrachtet, long
ist Ihre Antwort.
El long long
Datentyp ist der größte eingebaute integrale Datentyp in Standard C99 und C++0x. Genau wie bei allen anderen integralen Datentypen, long long
wird keine genaue Größe in Bytes angegeben. Stattdessen ist sie wie folgt definiert mindestens eine 64-Bit-Ganzzahl. Während long long
ist zwar nicht Teil des offiziellen C++-Standards, wird aber von allen modernen Compilern allgegenwärtig unterstützt. Beachten Sie jedoch, dass viele Compiler für moderne Desktops long
y long long
als jeweils genau 64-Bit, während viele Compiler für eingebettete Prozessoren die long
als 32-Bit und long long
als 64-Bit (natürlich mit ein paar Ausnahmen).
Wenn Sie mehr Präzision benötigen oder die long long
Wenn Sie eine Spracherweiterung benötigen, müssen Sie eine der C- oder C++-Bibliotheken verwenden, die für die Arbeit mit extrem großen oder kleinen Zahlen ausgelegt sind.
Sie können es vorziehen, sich keine Gedanken über primitive Namen zu machen, indem Sie auf den größten (vollständig realisierten) Typ der kompilierenden Architektur über <cstdint>
und seine Typendefinitionen intmax_t
y uintmax_t
.
Ich war überrascht, dass dies noch niemand gesagt hat, aber eine flüchtige Recherche zeigt, dass es in C++11 hinzugefügt wurde, was wahrscheinlich den Mangel an früheren Erwähnungen erklärt. (Obwohl sein neuer primitiver/eingebauter Typ long long
war zitiert!)
Einige Compiler können auch größere Typen bereitstellen, die allerdings mit Einsprüche zum Beispiel: Warum ist std::intmax_t in g++ kein __int128_t?
Ich persönlich benutze cstdint
da es einfacher ist, schnell zu sehen, wie viele Bytes ich mindestens benutze - anstatt sich merken zu müssen, wie viele Bits einem bestimmten Primitiv entsprechen - und der Standard bedeutet, dass meine Typen nicht plattformabhängig sind. Plus, für das, was ich tue, uint8_t
ist schneller und übersichtlicher als endlose unsigned char
s!
bearbeiten : Im Nachhinein möchte ich das klarstellen: uint8_t
ist nicht garantiert gleichbedeutend mit unsigned char
. Sicher, auf meinen Rechnern ist es so, und wahrscheinlich ist es auch bei Ihnen so. Aber diese Gleichwertigkeit wird von der Norm nicht gefordert; siehe: Wann ist uint8_t != unsigned char? Wenn ich also jetzt die standardmäßig definierten Spezialfähigkeiten von [[un]signed] char
verwende ich nur das.
Es gibt 128 Bit gepackte Ganzzahl- und Gleitkommaformate, die in xmmintrin.h auf Compilern definiert sind, die SSE unterstützen, um die Verwendung der SSE-Register und Anweisungen zu ermöglichen. Sie sind natürlich nicht Teil des C++-Standards, aber da sie von MSVC, GCC und dem Intel C++ Compiler unterstützt werden, gibt es ein gewisses Maß an plattformübergreifender Unterstützung (zumindest OS X, Linux und Windows für Intel CPUs). Andere ISAs haben SIMD-Erweiterungen, so dass es wahrscheinlich andere plattform-/Compiler-spezifische Erweiterungen gibt, die 128- oder 256-Bit-SIMD-Anweisungen unterstützen. Intels kommender AVX-Befehlssatz wird 256-Bit-Register haben, so dass wir einen neuen Satz von Datentypen und Intrinsics dafür sehen sollten.
Sie verhalten sich nicht ganz so wie eingebaute Datentypen (d.h. man muss intrinsische Funktionen anstelle von Operatoren verwenden, um sie zu manipulieren, und sie arbeiten mit SIMD-Operationen), aber da sie tatsächlich 128-Bit-Registern auf der Hardware entsprechen, verdienen sie Erwähnung.
- See previous answers
- Weitere Antworten anzeigen