Dans C99, j'inclus stdint.h et cela me donne UINT32_MAX ainsi que uint32_t. Cependant, en C++, UINT32_MAX est défini. Je peux définir __STDC_LIMIT_MACROS avant d'inclure stdint.h, mais cela ne fonctionne pas si quelqu'un inclut mon en-tête après avoir déjà inclus stdint.h lui-même.
Donc, en C++, quelle est la façon standard de trouver la valeur maximale représentable dans un uint32_t?
Eh bien, je ne sais pas uint32_t
mais pour les types fondamentaux (bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double
) vous devez utiliser le numeric_limits
modèles via #include <limits>
.
cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;
Si uint32_t
est un #define
de l'un des éléments ci-dessus, ce code devrait fonctionner hors de la boîte
cout << "Maximum value for uint32_t: " << numeric_limits<uint32_t>::max() << endl;
std::numeric_limits<T>::max()
définit la valeur maximale pour le type T
.
Eh bien, uint32_t sera toujours 32 bits et toujours non signé, vous pouvez donc le définir en toute sécurité manuellement:
#define UINT32_MAX (0xffffffff)
Vous pouvez aussi faire
#define UINT32_MAX ((uint32_t)-1)
Je ne peux pas commenter alors voici mon entrée sur la réponse de Glen vs Lior Kogan.
Si vous utilisez des variables statiques, vous rencontrerez le problème que si vous affectez une valeur constante à l'intérieur d'une classe à numeric_limits :: max (), cette valeur sera en fait définie sur zéro en raison de l'ordre d'initialisation (voir ce post - initialisation zéro et initialisation statique de la variable statique de portée locale )
Donc, dans ce cas, cela ne fonctionnera qu'en utilisant la réponse de Lior Kogan.
// This looks cleaner, less error prone and easier to read than the other suggested by Lior Kogan
#define UINT32_MAX ((uint32_t)-1)
Vous pourrez peut-être éliminer le #include
réglez les problèmes en modifiant votre processus de génération pour définir le __STDC_LIMIT_MACROS
symbole sur la ligne de commande du compilateur à la place:
cxx -D__STDC_LIMIT_MACROS ...
Bien sûr, vous auriez toujours des problèmes si un en-tête #undef
s ce symbole.
En outre, les auteurs de l'implémentation de bibliothèque standard que vous utilisez peuvent ne pas avoir voulu que les utilisateurs définissent ce symbole particulier; il peut y avoir un indicateur de compilateur ou un symbole différent que les utilisateurs sont censés utiliser pour activer les types C99 en C++.