2011-09-12 50 views
8

我跑在Windows XP下面兩段代碼(代碼:塊,MinGW的),和Ubuntu(11.04,G ++)持有2^63 -1長長

我已經運行下面的代碼

麻煩
#include <iostream> 

using namespace std; 

int main(){ 

    long long a = 9223372036854775807; 
    cout << a; 
    return 0; 

} 

也就是說數目爲2^63 -1。不過,我會得到一個錯誤,指出:

C:\Documents and Settings\JohnWong\My Documents\codeblock\343_hw_1\main.cpp|9|error: integer constant is too large for "long" type|

在Ubuntu上 - 它編譯,但是retunred答案是9223372036854775808,請注意8月末....

現在,如果我運行此代碼,使用權力的功能,我很好。

#include <iostream> 
#include <iomanip> 
#include <math.h> 
using namespace std; 

int main(){ 

    long long a = pow(2,64); 
    cout << "a: " << setprecision(20) << a << endl; 
    cout << "a-1: " << setprecision(20) << a-1 << endl; 
    cout << "a-2: " << setprecision(20) << a-2 << endl; 
    cout << "a+0: " << setprecision(20) << a+0 << endl; 
    cout << "a+1: " << setprecision(20) << a+1 << endl; 
    cout << "a+2: " << setprecision(20) << a+2 << endl; 
    cout << "a+3: " << setprecision(20) << a+3 << endl; 

    return 0; 
} 

我會得到我想要的值(從+1任何事情都會導致溢出,沒關係)。

在Ubuntu的輸出看起來是一樣的。好。

那麼是什麼回事?爲什麼常數不好? 我甚至嘗試了intmax_t和int64_t作爲運行第一個代碼的數據類型。

有人可以解釋這種行爲嗎?謝謝!

回答

13
long long a = 9223372036854775807LL; 

LL使文字成爲長整型文字。否則,文字默認是一個長文字,然後被存放在一個很長的時間之前流傳很久。

+0

@Eric,呃..是的。參考他在帖子中提出的警告。爲什麼編譯器不會自動升級......我不知道。 –

+0

不應要求'LL'。 「[無後綴]整數字面量的類型是[下面的列表]中的第一個,其值可以表示爲:int,long int,long long int。 (來自C++ 11 2.14.2/2; C99的語言實際上是一樣的,C++ 03具有相同的語言,但排除了long long int,因爲它不是C++ 03的一部分) 。儘管提議的添加LL的解決方案可能適用於某些編譯器,但它不應該是必需的(Visual C++ 2010,g ++ 4.5.1和Clang 3.0都接受不帶'LL'的代碼)。 –

+1

@詹姆斯,有趣。我在g ++ 4.4.3上發出警告。也許問題是這些編譯器不兼容C++ 11嗎? –

2

C++語言以前是沒有的C++ 11 long long類型。你的編譯器顯然不是C++ 11編譯器,它支持long long作爲擴展。這就是編譯器發出警告的原因。它警告你,文字是以非標準(擴展)方式解釋的,即在爲文字搜索合適的類型時,編譯器必須超出語言標準的界限。

+0

@ C++ 11。是啊,沒錯。謝謝! – CppLearner