我需要强力锻炼一年。编译器不断抛出此错误:
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;
}
请注意,我已尝试使用unsigned long long result(318338237039211050000ULL);
我正在使用gcc版本4.8.1
编辑:
以下是使用InfInt库http://code.google.com/p/infint/
的更正版本#include <iostream>
#include "InfInt.h"
using namespace std;
int main(){
InfInt year = "113";
InfInt result = "318338237039211050000";
InfInt pass= "1337";
while (pass != result)
{
for (InfInt i = 1; i<= year; i++)
{
pass += year * i * year;
}
cout << "year = " << year << " pass = " << pass << endl;
++year;
}
cout << "pass cracked with year = " << year << endl;
}
答案 0 :(得分:3)
快速查明系统数字限制的方法是使用std::numeric_limits。运行以下代码时系统上的输出:
#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 ;
}
是:
ull 0 18446744073709551615
我们可以看到最大值肯定小于你的文字值:
18446744073709551615
318338237039211050000
所以你的整数文字对于 unsigned long long 类型来说太大了。
答案 1 :(得分:1)
您的问题只是318338237039211050000ULL
超出了范围。
假设64位类型,64位值适用于log10(2 64 -1)十进制数字(即所有19位数值和一些较低的20位数值),{{1}有21位数。 2 64 -1(318338237039211050000ull
)是最大值。
值318338237039211050000至少需要log10(318338237039211050000)/ log10(2)位。这是69位。