web-dev-qa-db-fra.com

Existe-t-il des types plus grands que long long int en C++?

Existe-t-il des types plus grands que long long int en C++?

Mon compilateur est g ++.

38
Michael

Il existe une extension gcc pour les entiers 128 bits .

16
Jon

Non, mais vous pouvez utiliser des bibliothèques telles que GMP pour gérer des nombres plus importants.

8
jho

En fonction de vos besoins, vous pouvez créer votre propre structure pour gérer le type de données:

#include <cstdint>

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

uint256_t x;
8
J T

__int128
__uint128

Le plus grand centre commercial

7
KitsuneYMG

Normes

Les types entiers étendus sont explicitement autorisés par les normes C et C++.

C++ 11

C++ 11 N3337 draft 3.9.1 "Types fondamentaux", paragraphe 3:

Il existe cinq types d'entiers signés standard: «char signé», «int court», «int», «long int» et «long long int». Dans cette liste, chaque type fournit au moins autant de mémoire que ceux qui le précèdent dans la liste. Il peut également y avoir des types d'entiers signés étendus définis par l'implémentation. Les types entiers standard et étendus signés sont collectivement appelés types entiers signés. Plain ints ont la taille naturelle suggérée par l'architecture de l'environnement d'exécution; les autres types d'entiers signés sont fournis pour répondre à des besoins particuliers.

Vous devez également prendre en compte intmax_t, dont le paragraphe 18.4.1 "Synopsis d’en-tête" dit:

L'en-tête définit toutes les fonctions, types et macros identiques à 7.18 dans la norme C.

C99

Projet de C99 N1256 les autorise explicitement à la section 6.2.5 "Types":

Il existe cinq types d'entiers signés standard, désignés en tant que caractères signés, int court, int, long int et long long int. (Ces types et d'autres peuvent être désignés De plusieurs manières supplémentaires, comme décrit au 6.7.2.) Il peut également y avoir des types d'entiers signés étendus définis par la mise en œuvre.28) Les types entiers standard et étendus signés sont collectivement appelés entiers signés types.29)

et 7.18.1.5 "Types d'entiers de la plus grande largeur", paragraphe 1:

Le type suivant désigne un type entier signé capable de représenter toute valeur de tout type entier signé:

intmax_t

Résumant ...

Si vous avez besoin de stocker des valeurs entières exactes qui ne rentrent pas dans «long long», gcc propose le type __int128 . Ceci est une extension gcc, ne fait pas partie du C++ standard (à ce jour).

Si vous devez travailler avec des valeurs entières exactes encore plus grandes, vous avez probablement besoin d'un package arithmétique à précision arbitraire }, tel que GMP . Si vos besoins sont très limités, vous pouvez utiliser votre propre code de précision étendue, mais cela peut rapidement devenir plus compliqué (et moins efficace et moins fiable) que l’utilisation d’une bibliothèque existante.

Si vous devez stocker des nombres plus grands mais pas nécessairement les valeurs plus grandes exactement, vous pouvez utiliser float ou double: ils peuvent représenter des nombres de magnitude beaucoup plus grande, mais avec moins précision .

Et bien sûr, si vous voulez juste utiliser plus de mémoire, déclarez un tableau ;-)

2
Spike0xff

Si vous savez que votre nombre sera toujours positif, vous pouvez étendre la portée d'un int en le nommant unsigned

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

vous pouvez consulter la classe BigInt ... http://sourceforge.net/projects/cpp-bigint/

(Il y a beaucoup d'autres BigInts là-bas ...)

0
TCS