Existe-t-il des types plus grands que long long int en C++?
Mon compilateur est g ++.
Il existe une extension gcc pour les entiers 128 bits .
Non, mais vous pouvez utiliser des bibliothèques telles que GMP pour gérer des nombres plus importants.
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;
__int128
__uint128
Le plus grand centre commercial
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 ;-)
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
vous pouvez consulter la classe BigInt ... http://sourceforge.net/projects/cpp-bigint/
(Il y a beaucoup d'autres BigInts là-bas ...)