【问题标题】:C++ : integer constant is too large for its typeC++:整数常量对于它的类型来说太大了
【发布时间】:2013-10-31 20:13:29
【问题描述】:

我需要暴力破解一年的练习。编译器不断抛出这个错误:

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;
}

【问题讨论】:

  • 你应该使用 ASCII 表示。
  • 它是否因unsigned long long result = 318338237039211050000ULL; 而失败?可能只是它不喜欢那个初始化方法?
  • ` 警告:整数常量对于它的类型来说太大了` ...它不能存储在无符号长长变量中。就是这样。
  • 使用std::numeric_limits&lt;unsigned long long&gt;::max() 查看您的问题。 318338237039211050000 明显大于 18446744073709551615。
  • int128_t 应该足够大,如果您可以访问该类型。 69 bits required

标签: c++ gcc


【解决方案1】:

找出系统数字限制的快速方法是使用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 类型来说太大了。

【讨论】:

  • 谢谢。与其尝试寻找支持此操作的库,我将使用 python 实现相同的代码。
【解决方案2】:

您的问题只是 318338237039211050000ULL 超出范围。

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

值 318338237039211050000 至少需要 log10(318338237039211050000)/log10(2) 位。那是 69 位。

【讨论】:

  • 你不需要后缀;编译器给它一个类型来保存这个值。
  • @petebecker 所有整型字面量都默认为int,所以需要使用后缀
  • @texasbruce:这是不正确的。无后缀十进制整数文字的类型是intlong intlong long int 中可以表示其值的第一个。 (该列表在标准的早期版本中有所不同。)请参阅 C++ 标准中的第 2.14.2 [lex.icon] 节。
  • @KeithThompson:我们生活和学习。由于它与答案无关,因此我删除了有关后缀的评论。我发誓我已经让编译器报告了超过 int 大小的错误。也许在 C90 而不是 C++ 中,当然在 C++98 之前 - 我已经这样做了很长时间。使用后缀现在是我的一个习惯,而且可能不是一个坏习惯。文字值的默认类型可能与分配给它的类型不匹配,因此对于严格的类型协议,它可能仍然是“良好实践”而不是要求。
  • @Clifford:C90 规则是无后缀十进制文字的类型为 intlong intunsigned long int。在 C++98 中,它是 intlong int。预标准编译器可能需要int
猜你喜欢
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
相关资源
最近更新 更多