Quel est L'équivalent C++ de UINT32 MAX?
En C99, je comprend stdint.h et qui me donne UINT32_MAX ainsi que uint32_t. Toutefois, en C++ le UINT32_MAX est défini. Je peux définir les MACROS _ _ STDC _ LIMIT _ 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 eux-mêmes.
donc en C++, quelle est la façon standard de trouver la valeur maximale représentée dans uint32_t?
5 réponses
Eh bien, je ne sais pas pour 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 devriez utiliser les modèles numeric_limits
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 codes ci-dessus que ce code devrait figurer dans la case
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 pas signé, vous pouvez définir manuellement:
#define UINT32_MAX (0xffffffff)
, Vous pouvez aussi le faire
#define UINT32_MAX ((uint32_t)-1)
vous pourriez être en mesure d'éliminer les problèmes d'ordre #include
en changeant votre processus de construction pour définir le symbole __STDC_LIMIT_MACROS
sur la ligne de commande du compilateur à la place:
cxx -D__STDC_LIMIT_MACROS ...
bien sûr, vous auriez encore des problèmes si un en-tête #undef
s ce symbole.
en outre, les auteurs de l'implémentation de la bibliothèque standard que vous utilisez pourraient ne pas avoir prévu pour les utilisateurs de définir ce symbole particulier; il pourrait y avoir un compilateur drapeau ou un symbole différent que les utilisateurs sont censés utiliser pour activer les types C99 en C++.
Je ne peux pas commenter donc voici ma contribution sur la réponse de Glen vs Lior Kogan.
si vous utilisez des variables statiques, vous allez rencontrer le problème que si vous assignez une valeur constante à l'intérieur d'une classe à numeric_limits:: max () cette valeur sera en fait fixée à zéro en raison de l'ordre d'initialisation (voir ce post initialisation zéro et l'initialisation statique de la variable statique de portée locale )
Donc, dans ce cas, il ne travaille 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)