web-dev-qa-db-fra.com

Quel est l'équivalent C ++ de UINT32_MAX?

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?

32
kdt

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;
55
Glen

std::numeric_limits<T>::max() définit la valeur maximale pour le type T.

22
Pete Kirkham

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)
19
Lior Kogan

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)
1
Robert Rodriguez

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 #undefs 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++.

1
bk1e