C++ C++;:整型常量对于其类型太大

C++ C++;:整型常量对于其类型太大,c++,gcc,C++,Gcc,我需要花一年的时间来锻炼。编译器不断抛出此错误: bruteforceJS12.cpp:8:28:警告:整型常量对于其类型而言太大[默认情况下已启用] 我的代码是: #include <iostream> using namespace std; int main(){ unsigned long long year(0); unsigned long long result(318338237039211050000); unsigned long l

我需要花一年的时间来锻炼。编译器不断抛出此错误:

bruteforceJS12.cpp:8:28:警告:整型常量对于其类型而言太大[默认情况下已启用]

我的代码是:

#include <iostream>

using namespace std;

int main(){

    unsigned long long year(0);
    unsigned long long result(318338237039211050000);
    unsigned long long pass(1337);

    while (pass != result)
    {
    for (unsigned long long i = 1; i<= year; i++)
        {

        pass += year * i * year;

        }

        cout << "pass not cracked with year = " << year << endl;
        ++year;

    }

        cout << "pass cracked with year = " << year << endl;
}

一种快速计算系统上数值限制的方法是使用。运行以下代码时系统上的输出:

#include <iostream>
#include <limits>

int main()
{   
     std::cout << "ull\t"
              << std::numeric_limits<unsigned long long>::lowest() << '\t'
              << std::numeric_limits<unsigned long long>::max() << std::endl ;
}
我们可以看到最大值肯定小于您的文字值:

 18446744073709551615
 318338237039211050000

因此,整数文字对于无符号long-long类型来说太大。

一种快速计算系统数字限制的方法是使用。运行以下代码时系统上的输出:

#include <iostream>
#include <limits>

int main()
{   
     std::cout << "ull\t"
              << std::numeric_limits<unsigned long long>::lowest() << '\t'
              << std::numeric_limits<unsigned long long>::max() << std::endl ;
}
我们可以看到最大值肯定小于您的文字值:

 18446744073709551615
 318338237039211050000

因此,整数文本对于无符号长类型来说太大。

您的问题只是
31833823039211050000ull
超出范围

假设为64位类型,64位值适用于log10(264-1)十进制数字(即所有19位值和一些较低的20位值),
318382370392111050000ull
有21位。264-1(
18446744073709551615ull
)是最大值


值318338233703921050000至少需要log10(318338233703921050000)/log10(2)位。这是69位。

您的问题只是
318338239211050000ull
超出范围

假设为64位类型,64位值适用于log10(264-1)十进制数字(即所有19位值和一些较低的20位值),
318382370392111050000ull
有21位。264-1(
18446744073709551615ull
)是最大值



值318338233703921050000至少需要log10(318338233703921050000)/log10(2)位。这是69位。

您应该使用ASCII表示法。它是否会失败,结果是
无符号long-long-result=318338239211050000ull?这可能只是因为它不喜欢那个初始化方法吗?`警告:整型常量对于它的类型来说太大了'。。。它不能存储在无符号长变量中。就这些。使用
std::numeric\u limits::max()
查看您的问题所在。3183382382039211050000明显大于18446744073709551615。
int128\u t
应该足够大,如果您可以访问该类型。您应该使用ASCII表示法。它是否会因
无符号长结果=318338239211050000ull而失败?这可能只是因为它不喜欢那个初始化方法吗?`警告:整型常量对于它的类型来说太大了'。。。它不能存储在无符号长变量中。就这些。使用
std::numeric\u limits::max()
查看您的问题所在。3183382382039211050000明显大于18446744073709551615。
int128\u t
应该足够大,如果您可以访问该类型。非常感谢。我将用python实现相同的代码,而不是试图找到支持此操作的库。谢谢。我将用python实现相同的代码,而不是试图找到支持此操作的库;编译器给它一个将保存该值的类型。@petebecker所有整数文本都默认为int,因此您需要使用suffix@texasbruce:那是不正确的。无固定小数整数文本的类型是可以表示其值的
int
long int
long long int
中的第一个。(在标准的早期版本中,这个列表不同)参见C++标准中的2.2.2[Lex.IcI]部分。@ KeththppsPs:我们生活和学习。因为它与答案无关,所以我删除了关于后缀的注释。我发誓我已经有编译器报告错误超过了int的大小。也许在C90而不是C++,当然在C++ 98之前——我已经做了这么长时间了。使用后缀现在是我的一个习惯,可能不是一个坏习惯。文字值的默认类型可能与分配给它的类型不匹配,因此,对于严格的类型一致性,它可能仍然是“良好做法”,而不是一项要求。@Clifford:C90规则是,不固定的十进制文字的类型为
int
long int
,或
unsigned long int
。在C++98中,它是
int
long int
。标准前编译器可能需要
int
;编译器给它一个将保存该值的类型。@petebecker所有整数文本都默认为int,因此您需要使用suffix@texasbruce:那是不正确的。无固定小数整数文本的类型是可以表示其值的
int
long int
long long int
中的第一个。(在标准的早期版本中,这个列表不同)参见C++标准中的2.2.2[Lex.IcI]部分。@ KeththppsPs:我们生活和学习。因为它与答案无关,所以我删除了关于后缀的注释。我发誓我已经有编译器报告错误超过了int的大小。也许在C90而不是C++,当然在C++ 98之前——我已经做了这么长时间了。使用后缀现在是我的一个习惯,可能不是一个坏习惯。文字值的默认类型可能与分配给它的类型不匹配,因此,对于严格的类型一致性,它可能仍然是“良好做法”,而不是一项要求。@Clifford:C90规则是,不固定的十进制文字的类型为
int
long int
,或
unsigned long int
。在C++98中,它是
int
long int
。标准前编译器可能需要
int