【问题标题】:integer constant is too large for "long" type [duplicate]整数常量对于“long”类型来说太大了[重复]
【发布时间】:2011-07-29 07:59:24
【问题描述】:

可能重复:
long long in C/C++

为项目欧拉问题编写一个简单的程序。拒绝编译,因为“整数常量对于“long”类型来说太大了”,即使它应该在 unsigned long long 的大小限制内。使用 dev-c++ 编译器。

有问题的代码:

#include <iostream>

bool isprime (unsigned long long i)
{
    if(i==1||i==0) return false;
    if(i==2) return true;
    for(unsigned long long k=2;k!=i-1;k++)
    {      
        if(i%k==0) return false;
    }
    return true;
}

int main()
{
    for(unsigned long long i=600851475143;i>=0;i--) //problematic line
    {
        if(isprime(i))
        {
            std::cout<<i;
            std::cin.get();
            return 0;
        }
    }
}

【问题讨论】:

标签: c++ dev-c++


【解决方案1】:

您输入的文字的类型为int,不足以容纳该值。尝试600851475143ULL 作为第一个修复。

请注意,即使这样,您的 for 循环也永远不会终止,因为无符号数永远不会小于 0。相反,请使用 long long600851475143LL

【讨论】:

    【解决方案2】:

    必须是 dev-c++ 对 long long 数据类型支持的限制。它在 MS VC++ 2010 上编译良好。

    【讨论】:

    • 那将是 MS VC++ 2010 中的一个错误,除非它的原生 int 类型是 64 位。输入的文字是int
    • 我不想对此进行冗长的讨论,但我一直认为一个好的编译器应该为没有明确指定的文字的内部表示选择最合适的数据类型.在这种情况下,该值能够存储在 long long 中,但似乎编译器在查看实际值或任务目的地。总的来说,我不是 MS 的忠实粉丝,但在这种情况下,他们的方式对我来说确实“更好”。
    • ps - 我知道 c++ 的正式定义说数字文字存储在编译器用作其本机 int 类型的任何内容中。但我不会将 MS 方法称为 bug - 它对我来说更像是一个非标准扩展
    【解决方案3】:

    尝试使用“ULL”后缀:600851475143ULL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      相关资源
      最近更新 更多