C++中的UINT32_MAX相当于什么?

48

在 C99 中,我可以包含 stdint.h 头文件,获得 UINT32_MAXuint32_t 数据类型。然而,在 C++ 中,UINT32_MAX 没有被定义。我可以在包含 stdint.h 之前定义 __STDC_LIMIT_MACROS,但如果有人在已经包含了 stdint.h 的情况下再包含我的头文件,则这种方法不起作用。

那么,在 C++ 中,找出可表示的最大值 uint32_t 的标准方法是什么?


13
死灵法术的附注:在 C++ 中使用 #include <cstdint> - AJG85
@AJG85 有正确的答案。 - Mike Andrews
6个回答

72

对于基本类型 (bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, doublelong double),你可以使用 #include <limits> 中的 numeric_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;

4
或者,如果uint32_t是以上类型之一的typedef呢? - Craig McQueen
1
我真希望这是一个typedef。如果你的工具使用#define,那我就会质疑它们的质量。 - John
2
为了避免numeric_limits :: min() ,numeric_limits :: max()与std :: min()和std :: max()混淆,我不得不像这样用括号将其括起来:(std :: numeric_limits :: max)(); - o'aoughrouer

32

std::numeric_limits<T>::max() 定义了类型 T 的最大值。


24

uint32_t始终为32位,并且始终为无符号数,因此您可以安全地手动定义它:

#define UINT32_MAX  (0xffffffff)
你也可以这样做。
#define UINT32_MAX  ((uint32_t)-1)

47
当我们拥有完全有效的标准C++结构时,我们不需要采用那种方式,这些结构只使用了三倍的字符数。 - John
1
@John:这是完全标准和可移植的。 - Ben Voigt
标准库可能并不总是可用的 - 对于内核模块代码等。 - mmtauqir
1
如果<limits>、<cstdint>或<stdint.h>都不可用,我只会考虑这个作为备选方案。但是,是的... - Aconcagua
@BenVoigt 我觉得John是在讽刺... - 71GA
1
@71GA:是的,但也声称C++需要您以更长的方式进行可移植性/标准兼容性。这是不正确的。他所说的C++结构允许您在具有类型参数的模板代码中使用限制,而C++宏永远无法做到这一点。 - Ben Voigt

3
我不能评论,所以这是我对 Glen 和 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)

1
任何无符号整数类型 T 的最大值为 T(~T(0))

1

您可以通过更改构建过程,在编译器命令行上定义__STDC_LIMIT_MACROS符号来消除#include顺序问题:

cxx -D__STDC_LIMIT_MACROS ...

当然,如果头文件中使用了 #undef 指令取消该符号,则您仍可能遇到麻烦。

此外,您使用的标准库实现的作者可能不希望用户设置该特定符号;可能会有编译器标志或其他符号供用户使用以在 C++ 中启用 C99 类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接