【问题标题】:Equivalence of <limits> and <climits><limits> 和 <climits> 的等价性
【发布时间】:2009-03-17 06:05:56
【问题描述】:
  1. 这是否保证总是正确的:

    std::numeric_limits<int>::max() == INT_MAX
    

    C++ 标准对此有何评论?我在标准中找不到任何明确说明这一点的参考资料,但我一直在读那些应该是等效的。

  2. 对于同时实现 C99(至少是 long long 部分)和 C++98 的编译器来说,不在 C++98 标准中的 C99 类型呢?我不确定是否有任何保证这始终成立:

    std::numeric_limits<unsigned long long>::max() == ULLONG_MAX
    

    这是一个合理的假设吗?

【问题讨论】:

    标签: c++ c stl standards limits


    【解决方案1】:

    我的 C++ 2003 标准副本说 numeric_limits&lt;&gt;::max()min() 模板将返回值:

    相当于CHAR_MIN, SHRT_MIN, FLT_MIN, DBL_MIN,

    相当于CHAR_MAX, SHRT_MAX, FLT_MAX, DBL_MAX,

    但是,这些都在脚注中。 ISO/IEC 指令第 3 部分:“[脚注] 不应包含要求。”虽然表格或图表的脚注可能是必需的。

    【讨论】:

    • 为了迂腐,脚注不是标准的一部分。
    • @dirkgently - 你是对的(虽然这很难找到)。它在 ISO/IEC 指令第 3 部分:“[脚注] 不应包含要求。”虽然表格或图表的脚注可能是必需的。
    • 不幸的是,它似乎是标准中唯一提到这一点的地方。
    【解决方案2】:

    第一个应该保证是真的:std::numeric_limits&lt;int&gt;::max() == INT_MAX

    但是,对于 unsigned long long,没有任何保证,因为编译器/库不需要支持它们。但是……

    如果您的编译器和库支持 unsigned long long,它应该是相等的,因为无论您如何询问,类型的限制都是相同的。

    是的,这是一个合理的假设。

    【讨论】:

      【解决方案3】:

      C++ 中显然不能保证 long long 数据类型,因为 long long 数据类型在 C++ 中尚不存在。它们的行为方式(如果存在以及何时存在)取决于编译器,并且应该由编译器记录。

      【讨论】:

        【解决方案4】:

        虽然据我所知,它不是任何一个标准的一部分,但它肯定是一个合理的假设,特别是如果您拥有来自同一套件或供应商的编译器。例如,G++ 4.3 仅使用来自&lt;limits&gt; 的#defined 值在&lt;climits&gt; 中。

        【讨论】:

          猜你喜欢
          • 2017-10-08
          • 1970-01-01
          • 2012-11-12
          • 2018-11-19
          • 1970-01-01
          • 2018-02-23
          • 2018-06-28
          • 1970-01-01
          • 2020-12-16
          相关资源
          最近更新 更多