2011-04-04 95 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