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?

Était-ce utile?

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 #undefs 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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top