2011-04-04 59 views
17

可能重复过大:
long long in C/C++整型常量是 “长” 型

写作项目欧拉问题的简单程序。拒绝编译,因为“整型常量对于长”类型“来说太大”,尽管它应该在的无符号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; 
     } 
    } 
} 
+1

可能的重复:http://stackoverflow.com/questions/1458923/long-long-in-cc – 2011-04-04 16:42:23

+0

看起来像http://projecteuler.net/problem=3 :-)找到这个答案,而试图解决同样的:-) – 2014-04-15 23:27:37

回答

25

尝试一个 “ULL” 后缀:600851475143ULL

+3

更好,尝试'ULL',它是'无符号long long'。 – Xeo 2011-04-04 16:41:36

+0

@Xeo:对。完成。 – 2011-04-04 16:42:06

+0

你知道什么,它的工作原理。我忘记了后缀。 – Bacu 2011-04-04 16:58:50

0

必须的开发 - C++支持长长数据类型的限制。它在MS VC++ 2010上编译得很好。

+3

那么这将是MS VC++ 2010中的一个bug,除非它的本地'int'类型是64位。键入的文字是一个“int”。 – 2011-04-04 16:51:32

+0

我不想在这方面进行长时间的讨论,但我始终明白,一个好的编译器应该选择最合适的数据类型来表示没有明确指定它的文字的内部表示。在这种情况下,该值可以存储在一个** long long **中,但是在查看实际值或赋值目标之前,似乎copmpiler选择只使用** long **。我并不是MS的忠实粉丝,但在这种情况下,他们的方式对我来说看起来“更好”。 – FumbleFingers 2011-04-04 17:38:38

+0

ps - 我知道C++的正式定义,数字文字存储在编译器使用的任何** int **类型中。但我不会把MS方法称为*错误* - 它对我来说更像是一个非标准的扩展。 – FumbleFingers 2011-04-04 17:47:54

3

你输入的字面值为int,它的大小不足以保存值。作为第一个修补程序,请尝试600851475143ULL

即使这样,请注意您的for循环将永远不会终止,因为无符号永远不会小于0.而是使用long long600851475143LL