Quel est le C de l'équivalent de UINT32_MAX?
Question
En C99, je comprend stdint.h et qui me donne UINT32_MAX ainsi que uint32_t. Cependant, en C ++ le UINT32_MAX se définit dehors. Je peux définir __STDC_LIMIT_MACROS avant d'inclure stdint.h, mais cela ne fonctionne pas si quelqu'un y compris mon en-tête après avoir déjà compris stdint.h eux-mêmes.
Donc, en C ++, ce qui est la façon habituelle de trouver la valeur maximale représentable dans un uint32_t?
La solution
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 les modèles de 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
d'un de ce qui précède que ce code devrait fonctionner hors de la boîte
cout << "Maximum value for uint32_t: " << numeric_limits<uint32_t>::max() << endl;
Autres conseils
std::numeric_limits<T>::max()
définit la valeur maximale pour le type T
.
Eh bien, uint32_t aura toujours 32 bits, et toujours non signé, de sorte que vous pouvez définir manuellement en toute sécurité:
#define UINT32_MAX (0xffffffff)
Vous pouvez également faire
#define UINT32_MAX ((uint32_t)-1)
Vous pouvez être en mesure d'éliminer les problèmes d'ordre de #include
en changeant votre processus de construction pour définir le symbole de __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 la mise en œuvre de la bibliothèque standard que vous utilisez peut ne pas avoir l'intention des utilisateurs de définir ce symbole particulier; il pourrait y avoir un drapeau de compilateur ou un autre symbole que les utilisateurs sont destinés à utiliser pour activer les types C99 en C ++.
Je ne peux pas commenter voici donc mon entrée sur Glen vs la réponse de Lior Kogan.
Si vous utilisez des variables statiques que vous exécuterez dans le problème que si vous attribuez une valeur constante dans une classe à numeric_limits :: max () cette valeur sera en effet mis à zéro en raison de l'ordre d'initialisation (voir ce après zéro et initialisation de l'initialisation statique de portée locale variable statique )
Donc, dans ce cas, il ne fonctionne 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)