【问题标题】:Which data type to use for a very large numbers in C++?在 C++ 中使用哪种数据类型来处理非常大的数字?
【发布时间】:2010-08-29 15:05:50
【问题描述】:

我必须将号码600851475143 存储在我的程序中。我尝试将其存储在long long int 变量和long double 中,但在编译时显示错误

integer constant is too large for "long" type. 

我也试过unsigned long long int。我正在使用 MinGW 5.1.6 在 Windows 上运行 g++。

我应该使用什么数据类型来存储数字?

【问题讨论】:

    标签: c++ types largenumber


    【解决方案1】:

    long long 很好,但你必须在字面上使用后缀。

    long long x = 600851475143ll; // can use LL instead if you prefer.
    

    如果您将ll 留在文字末尾,则编译器会假定您希望它是int,在大多数情况下是一个32 位有符号数。 32 位不足以存储这么大的值,因此会发出警告。通过添加ll,您向编译器表明该文字应被解释为long long,它足以存储值。

    后缀对于指定函数调用哪个重载也很有用。例如:

    void foo(long long x) {}
    void foo(int x) {}
    
    int main()
    {
        foo(0); // calls foo(int x)
        foo(0LL); // calls foo(long long x)
    }
    

    【讨论】:

    • 谢谢,但谁能解释一下我们为什么要这样做?添加文字会发生什么?
    • 你真的应该在这里使用大写的LL。
    • 我确实将其添加为评论,但老实说,我认为我从未将 Courier New 中的 l 与 1 混淆,这是大多数编辑使用的字体。
    • 之所以要加上Ls,简而言之,是因为C++编译器实在是太笨了。它不会尝试将其作为 int,然后作为 long,然后作为 long long 等等。所以我们必须告诉它它是 long long 以便它在堆上为其分配足够的空间(因为字面量在将它们分配给您的变量之前,也获得自己的空间)。我对 C++ 的一般规则:告诉它一切。不太擅长扣分。如果您想要福尔摩斯,请询问 Python。 :D
    【解决方案2】:

    您对long long int(或unsigned long long int)的想法是正确的,但为了防止出现警告,您需要告诉编译器该常量是long long int

    long long int value = 600851475143LL;
    

    那些“L”可以是小写的,但我建议不要这样做——根据字体,小写的“L”通常看起来很像一个数字(“1”)。

    【讨论】:

      【解决方案3】:

      看看 GNU MP Bignum 库http://gmplib.org/

      【讨论】:

      • 用大象枪射击老鼠的方法。
      • 嗯,由于问题的标题是如何写的,我想很多人猎大象都到了这里。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 2018-06-11
      • 2013-08-05
      • 2010-10-07
      相关资源
      最近更新 更多