【问题标题】:What's the C++ equivalent of UINT32_MAX?UINT32_MAX 的 C++ 等价物是什么?
【发布时间】:2010-12-01 01:51:48
【问题描述】:

在 C99 中,我包含 stdint.h,这给了我 UINT32_MAXuint32_t 数据类型。但是,在 C++ 中,UINT32_MAX 被定义了。我可以在包含stdint.h 之前定义__STDC_LIMIT_MACROS,但是如果有人在自己已经包含stdint.h 之后包含我的标题,这将不起作用。

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

【问题讨论】:

  • 死灵附注:C++ 中的#include <cstdint>
  • @AJG85 有正确答案。

标签: c++ types c99


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    不确定uint32_t,但对于基本类型(boolcharsigned charunsigned charwchar_tshortunsigned shortint、@987654@3 、longunsigned longfloatdoublelong 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;
    

    【讨论】:

    • 或者如果uint32_t 是上述之一的typedef
    • 我当然希望它是 typedef。如果您的工具为此使用 #define,我会怀疑它们的质量。
    • 为了避免 numeric_limits::min()、numeric_limits::max() 与 std::min() 和 std::max() 混淆,我必须将其括在括号中,例如这: (std::numeric_limits::max)();
    【解决方案3】:

    嗯,uint32_t 永远是 32 位的,而且永远是无符号的,所以你可以放心地手动定义它:

    #define UINT32_MAX  (0xffffffff)
    

    你也可以这样做

    #define UINT32_MAX  ((uint32_t)-1)
    

    【讨论】:

    • 当我们拥有完全有效的标准 C++ 构造且仅使用 3 倍的字符时,我们不需要诉诸于此。
    • @John:这是完全标准的和可移植的。
    • 标准库可能并不总是可用 - 对于内核模块代码,例如...
    • 如果 都不可用,我认为这只是一个后备解决方案。但是,是的……
    【解决方案4】:

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

    cxx -D__STDC_LIMIT_MACROS ...
    

    当然,如果标题#undefs 这个符号,你仍然会遇到麻烦。

    此外,您使用的标准库实现的作者可能并不打算让用户设置该特定符号;用户可能会使用编译器标志或其他符号来启用 C++ 中的 C99 类型。

    【讨论】:

      【解决方案5】:

      我无法发表评论,所以这是我对 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)
      

      【讨论】:

        猜你喜欢
        • 2014-05-08
        • 1970-01-01
        • 1970-01-01
        • 2011-01-19
        • 2010-12-07
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2010-09-17
        相关资源
        最近更新 更多