在C99中,我包含了stdint.h,它给了我UINT32_MAX和uint32_t。但是,在C ++中,UINT32_MAX被定义出来。我可以在包含stdint.h之前定义__STDC_LIMIT_MACROS,但是如果有人在已经包含stdint.h之后包含我的头文件,则这不起作用。
所以在C ++中,找出uint32_t中可表示的最大值的标准方法是什么?
答案 0 :(得分:53)
好吧,我不了解uint32_t
,但对于基本类型(bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double
),您应该通过numeric_limits
使用#include <limits>
模板。
cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;
如果uint32_t
是上述其中一项的#define
,则此代码应开箱即用
cout << "Maximum value for uint32_t: " << numeric_limits<uint32_t>::max() << endl;
答案 1 :(得分:21)
std::numeric_limits<T>::max()
定义类型T
的最大值。
答案 2 :(得分:19)
嗯,uint32_t将始终为32位,并且始终是无符号的,因此您可以安全地手动定义它:
#define UINT32_MAX (0xffffffff)
您也可以
#define UINT32_MAX ((uint32_t)-1)
答案 3 :(得分:1)
您可以通过更改构建过程来消除#include
订单问题,以在编译器命令行中定义__STDC_LIMIT_MACROS
符号:
cxx -D__STDC_LIMIT_MACROS ...
当然,如果标题#undef
是此符号,您仍然会遇到问题。
此外,您正在使用的标准库实现的作者可能没有打算让用户设置该特定符号;可能存在编译器标志或用户用于在C ++中启用C99类型的不同符号。
答案 4 :(得分:1)
我无法评论,所以这里是我对Glen vs Lior Kogan的回答。
如果你使用的是静态变量,你会遇到这样的问题:如果你在一个类中给一个常量值给numeric_limits :: max(),那么由于初始化的顺序,这个值实际上会被设置为零(见这个发表zero initialization and static initialization of local scope static variable)
因此,在这种情况下,只能使用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)