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?

28
demandé sur kdt 2009-09-24 16:23:36

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;
50
répondu Glen 2013-10-07 03:29:25

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

19
répondu Pete Kirkham 2009-09-24 12:39:50

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)
19
répondu Lior Kogan 2009-09-24 16:51:48

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

1
répondu bk1e 2009-09-24 17:39:24

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)
0
répondu Robert Rodriguez 2017-05-23 12:10:36