我尝试
long long int l = 42343254325322343224;
但是没有效果。它为什么告诉我,“整数常量太长”。我正在使用 long long int 类型,它应该能够容纳超过 19 位数字。我在这里做错了什么,还是有一个我还不知道的特殊秘密?
我尝试
long long int l = 42343254325322343224;
但是没有效果。它为什么告诉我,“整数常量太长”。我正在使用 long long int 类型,它应该能够容纳超过 19 位数字。我在这里做错了什么,还是有一个我还不知道的特殊秘密?
因为在我的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
您不应该将数字的位数与表示数字所需的比特数混淆
long long
类型的长度是64位——它可以容纳的最大值是2的63次方减1,而不是2的64次方。原则上,在某些系统上,long long
可能比64位更宽,但在我听说过支持它的每个系统上,它恰好是64位。 - Keith Thompson请看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!
long long
或unsigned long long
的字面量来初始化cpp_int
,则可以使用字符串字面量。例如:cpp_int u {"42343254325322343224"};
- Benjamin Lindley看起来整数字面值的值超过了long long int
类型可接受的值
尝试运行以下程序以确定long long int
和unsigned 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;
}
9223372036854775807
18446744073709551615
您可以将其与您指定的值进行比较。
42343254325322343224
请注意,在一般情况下,不需要为整数十进制字面量指定后缀ll
,如果整数太大只能存储在long long int
类型中,则编译器本身将确定最适当的类型(int
或long int
或long long int
)。