web-dev-qa-db-de.com

Gibt es Typen, die in C++ größer als long long int sind?

Gibt es Typen, die in C++ größer als long long int sind?

Mein Compiler ist g ++.

38
Michael
16
Jon

Nein, aber Sie können Bibliotheken wie GMP verwenden, um größere Zahlen zu verarbeiten.

8
jho

Je nach Bedarf können Sie eine eigene Struktur erstellen, um den Datentyp zu behandeln:

#include <cstdint>

struct uint256_t
{
    std::uint64_t bits[4];
};

uint256_t x;
8
J T

__int128
__uint128

Das

7
KitsuneYMG

Standards

Erweiterte Integer-Typen werden von den C- und C++ - Standards explizit zugelassen.

C++ 11

C++ 11 N3337 Entwurf 3.9.1 "Grundlegende Typen" Absatz 3 besagt:

Es gibt fünf standardisierte Integer-Typen mit Vorzeichen: "signiertes Zeichen", "short int", "int", "long int" und "long long int". In dieser Liste bietet jeder Typ mindestens so viel Speicherplatz wie die vorangegangenen. Es können auch implementierungsdefinierte erweiterte vorzeichenbehaftete Integer-Typen vorhanden sein. Die Standard- und erweiterten Integer-Typen mit Vorzeichen werden zusammenfassend als Integer-Typen mit Vorzeichen bezeichnet. Plain Ints haben die natürliche Größe, die von der Architektur der Ausführungsumgebung vorgeschlagen wird. Die anderen vorzeichenbehafteten Integer-Typen werden bereitgestellt, um die speziellen Anforderungen zu erfüllen.

Sie sollten auch intmax_t in Betracht ziehen, was in Absatz 2, Abschnitt 18.4.1 "Kopfzeile" heißt:

Der Header definiert alle Funktionen, Typen und Makros wie in 7.18 im C-Standard.

C99

C99 N1256 Draft erlaubt sie ausdrücklich bei 6.2.5 "Typen" Absatz 4:

Es gibt fünf standardisierte Integer-Typen mit Vorzeichen, die als signiertes Zeichen, short int, int, long int und long long int bezeichnet werden. (Diese und andere Typen können .__ auf verschiedene zusätzliche Arten gekennzeichnet werden, wie in 6.7.2 beschrieben.) Es können auch implementierungsdefinierte Typen mit erweiterten vorzeichenbehafteten Integer vorliegen.28 types.29)

und 7.18.1.5 "Ganzzahlige Typen mit der größten Breite" Absatz 1 sagt:

Der folgende Typ bezeichnet einen vorzeichenbehafteten Integer-Typ, der einen beliebigen Wert eines vorzeichenbehafteten Integer-Typs darstellen kann:

intmax_t

Zusammenfassend ...

Wenn Sie genaue ganzzahlige Werte speichern müssen, die nicht in "long long" passen, bietet gcc den Typ __int128 an. Dies ist eine gcc-Erweiterung, die nicht Teil des Standard-C++ ist (zum Zeitpunkt der Veröffentlichung).

Wenn Sie mit noch größeren, ganzzahligen Werten arbeiten müssen, benötigen Sie wahrscheinlich ein Arithmetikpaket mit beliebiger Genauigkeit , beispielsweise GMP . Wenn Ihr Bedarf sehr begrenzt ist, können Sie Ihren eigenen erweiterten Präzisionscode rollen, was jedoch schnell komplizierter (und weniger effizient und verlässlich) wird als die Verwendung einer vorhandenen Bibliothek.

Wenn Sie größere Zahlen speichern müssen, aber die größeren Werte nicht exakt speichern müssen, können Sie float oder double verwenden: Diese Zahlen können Zahlen mit viel größerer Stärke darstellen, jedoch mit einer geringeren Genauigkeit von Genauigkeit .

Und natürlich, wenn Sie nur mehr Speicherplatz beanspruchen möchten, deklarieren Sie ein Array ;-)

2
Spike0xff

Wenn Sie wissen, dass Ihre Nummer immer positiv ist, können Sie den Gültigkeitsbereich einer int erweitern, indem Sie sie als unsigned bezeichnen

int myNum; // Range is from –2,147,483,648 to 2,147,483,647

unsigned int myNum; // Range is from 0 to 4,294,967,295

0
Gunner Stone

sie können die BigInt-Klasse ausprobieren ... http://sourceforge.net/projects/cpp-bigint/

(Es gibt viele andere BigInts da draußen ...)

0
TCS