【问题标题】:C++: max integer [duplicate]C ++:最大整数[重复]
【发布时间】:2010-12-16 11:07:44
【问题描述】:

是否有 C++ 跨平台库为我提供可移植的最大整数?

我要声明:

const int MAX_NUM = /* call some library here */;

我使用非托管的 MSVC 2008。

【问题讨论】:

  • 你不需要lib,你需要学习C++;你要的是标准 c++ (std::numeric_limits)

标签: c++


【解决方案1】:

在C++标准库头<limits>中,你会发现:

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

这将告诉您可以存储在int 类型变量中的最大值。 numeric_limits 是一个类模板,您可以将任何数字类型传递给它,以获得它们可以容纳的最大值。

numeric_limits类模板有很多other information about numeric types as well

【讨论】:

  • 实际上它被称为“函数模板”,而不是相反。但除此之外,这是非常好的建议。 +1
  • @sbi:感谢您的指正。 C++ 标准确实称它们为“函数模板”(14.8.1),但也使用了“非模板函数”这个短语,这让我认为“模板函数”这个短语也可以接受;即使是信誉良好的 C++ 参考资料 (parashift.com/c++-faq-lite/templates.html#faq-35.13) 也会使用“模板函数”这一短语。无论如何,我已经用明确正确的术语更新了答案。 :-)
  • Comeau 对此有一个常见问题解答:comeaucomputing.com/techtalk/templates/#terms
  • @gf:谢谢;我以前没看过那个FAQ(我没用过Comeau),但是那里有很多有趣的东西。不过,我不得不再次更正我的答案,因为其中没有任何模板函数或函数模板。 numeric_limits 是一个类模板。
  • 以类似的方式,谈论词序,这“可移植地提供最大整数”,而不是“提供可移植的最大整数”。不存在作为可移植最大整数的整数,正是因为 numeric_limits 存在的原因,它在不同的实现中是不同的;-)
【解决方案2】:

请参阅 limits.h (C) 或 climits (C++)。在这种情况下,您需要 INT_MAX 常量。

【讨论】:

    【解决方案3】:

    我知道这是一个老问题,但也许有人可以使用这个解决方案:

    int size = 0; // Fill all bits with zero (0)
    size = ~size; // Negate all bits, thus all bits are set to one (1)
    

    到目前为止,我们的结果是 -1,直到 size 是一个有符号整数。

    size = (unsigned int)size >> 1; // Shift the bits of size one position to the right.
    

    正如标准所说,如果变量是有符号且为负数,则移入的位为 1,如果变量为无符号或有符号且为正数,则为 0。

    由于 size 是有符号和负数的,我们会将符号位移入 1,这没有多大帮助,因此我们强制转换为 unsigned int,强制移入 0,将符号位设置为 0,同时让所有其他位保持 1。

    cout << size << endl; // Prints out size which is now set to maximum positive value.
    

    我们也可以使用掩码和异或,但我们必须知道变量的确切位大小。通过在位前移位,我们不必随时知道 int 在机器或编译器上有多少位,也不需要包含额外的库。

    【讨论】:

      【解决方案4】:

      我知道答案已经给出,但我只想知道从前,我曾经这样做过

      int max = (unsigned int)-1
      

      它会给出相同的结果

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

      ?

      【讨论】:

      • 这个技巧只适用于无符号最大值。
      • 这是一个关于问题的问题,为什么是-2!?
      • 为了将来参考,StackOverflow 最适合作为 1 Question -> Many Answer 类型的东西。如果您有问题(并且您提出的问题似乎合理),请随时发布一个全新的问题。在这里,您似乎试图提供其他人认为不正确的建议。
      • 扩展安德烈所说的:不,它不会给出相同的结果。 (int)(unsigned int)-1 是 -1(嗯,实际上它是实现定义的,但通常是 -1),而 std::numeric_limits&lt;int&gt;::max() 是一个很大的正值 int。但是,(unsigned int)-1 始终等于 std::numeric_limits&lt;unsigned int&gt;::max()
      • @SteveJessop 仅适用于二人称赞平台。 C/C++ 不保证一个/两个恭维。
      【解决方案5】:

      在带有 aCC 编译器的 Hp UX 上:

      #include <iostream>
      #include <limits>
      using namespace std;
      
      int main () {
        if (sizeof(int)==sizeof(long)){
          cout<<"sizeof int == sizeof long"<<endl;
        } else {
          cout<<"sizeof int != sizeof long"<<endl;
        }
      
        if (numeric_limits<int>::max()==numeric_limits<long>::max()){
          cout<<"INT_MAX == lONG_MAX"<<endl;
        } else {
          cout<<"INT_MAX != LONG_MAX"<<endl;
        }
      
        cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;
        cout << "Maximum value for long: " << numeric_limits<long>::max() << endl;
        return 0;
      }
      

      打印出来:

      sizeof int == sizeof long

      INT_MAX != LONG_MAX

      我检查了 int 和 long 类型都是 4bytes。 manpage limits(5) 说 INT_MAX 和 LONG_MAX 都是 2147483647

      http://nixdoc.net/man-pages/HP-UX/man5/limits.5.html

      因此,结论 std::numeric_limits:: 不可移植。

      【讨论】:

      • 我会得出结论,无论是在实现中还是在您的程序中,都存在错误。我认为您的程序没有问题,但如果您复制并粘贴 exact 输出(包括最后两行)会很有帮助。
      • 链接指向关于浮点限制的讨论,而不是整数限制。你确定它是相关的吗?
      猜你喜欢
      • 2019-08-15
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 2012-12-04
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多