为什么不能使用 long long int 类型?C++

3

我尝试

long long int l = 42343254325322343224;

但是没有效果。它为什么告诉我,“整数常量太长”。我正在使用 long long int 类型,它应该能够容纳超过 19 位数字。我在这里做错了什么,还是有一个我还不知道的特殊秘密?


2
那超过了2的63次方。 - chris
有没有办法使类的一个对象保存任意数量的整数? - Fred Roy
你需要66位来存储那个数字。这不是“数字的位数”,而是“数字的大小”。2^64 = 18446744073709551616,而你远超过了这个范围。 - Marc B
@FredRoy,是的,而且已经做得非常好了。使用任意精度整数库即可。 - chris
1
boost::multiprecision - Borgleader
3个回答

6

因为在我的x86_64系统上,它更接近于2^64

//                                         42343254325322343224
// maximum for 8 byte long long int (2^64) 18446744073709551616
//                    (2^64-1 maximum unsigned representable)
std::cout << sizeof(long long int); // 8

您不应该将数字的位数与表示数字所需的比特数混淆


3
无论你使用什么系统,它都超过了2的64次方。重要的是long long类型的长度是64位——它可以容纳的最大值是2的63次方减1,而不是2的64次方。原则上,在某些系统上,long long可能比64位更宽,但在我听说过支持它的每个系统上,它恰好是64位。 - Keith Thompson
我也是,从未听说过有任何不同的系统。 - Marco A.

4

请看Boost.Multiprecision的网站:Boost.Multiprecision

它定义了处理更大数字的模板和类。

以下是来自Boost教程的示例:

#include <boost/multiprecision/cpp_int.hpp>

using namespace boost::multiprecision;

int128_t v = 1;

// Do some fixed precision arithmetic:
for(unsigned i = 1; i <= 20; ++i)
   v *= i;

std::cout << v << std::endl; // prints 20!

// Repeat at arbitrary precision:
cpp_int u = 1;
for(unsigned i = 1; i <= 100; ++i)
   u *= i;

std::cout << u << std::endl; // prints 100!

存储一个非常大的整数的示例是什么样子的?我现在正在下载库的过程中。 - Fred Roy
@FredRoy 我从他们的教程中粘贴了一个例子。100!是一个非常大的整数。 - Wayne Tanner
1
请注意,如果您想使用无法适应long longunsigned long long的字面量来初始化cpp_int,则可以使用字符串字面量。例如:cpp_int u {"42343254325322343224"}; - Benjamin Lindley
谢谢 Wayne。这是最佳答案!现在它将解决我的问题! - Fred Roy

3

看起来整数字面值的值超过了long long int类型可接受的值

尝试运行以下程序以确定long long intunsigned long long int类型的最大值

#include <iostream>
#include <limits>

int main() 
{
    std::cout << std::numeric_limits<long long int>::max() << std::endl;
    std::cout << std::numeric_limits<unsigned long long int>::max() << std::endl;

    return 0;
}

我已经在www.ideone.com上获得了以下结果。
9223372036854775807
18446744073709551615

您可以将其与您指定的值进行比较。

42343254325322343224

请注意,在一般情况下,不需要为整数十进制字面量指定后缀ll,如果整数太大只能存储在long long int类型中,则编译器本身将确定最适当的类型(intlong intlong long int)。


我得到了相同的结果。 - Fred Roy
@Fred Roy 这意味着您正在尝试使用太大的十进制字面量,无法存储在 long long int 类型的对象中。 - Vlad from Moscow

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