我跑在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作爲運行第一個代碼的數據類型。
有人可以解釋這種行爲嗎?謝謝!
@Eric,呃..是的。參考他在帖子中提出的警告。爲什麼編譯器不會自動升級......我不知道。 –
不應要求'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'的代碼)。 –
@詹姆斯,有趣。我在g ++ 4.4.3上發出警告。也許問題是這些編譯器不兼容C++ 11嗎? –