私のWindows XP上のコードを2枚以下(コード:ブロック、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です。しかし、私はというエラーを取得します:Ubuntuで
C:\Documents and Settings\JohnWong\My Documents\codeblock\343_hw_1\main.cpp|9|error: integer constant is too large for "long" type|
を - それがコンパイルされますが、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を試しました。
誰かがこの現象を説明できますか?ありがとう!
@エリック、そうです。彼が投稿に入れた警告を参照してください。コンパイラが自動的にアップグレードされない理由は分かりません。 –
「LL」は必須ではありません。 "[接尾辞なしの]整数リテラルの型は、その値が表現できる最初の[int、long int、long long int]です。" (C++ 11 2.14.2/2から; C99には実質的に同じことが言える言語があり、C++ 03は同じ言語を持っていますが、C++ 03の一部ではないためlong long intは除外しています) 。 'LL'を追加する提案された解決策はいくつかのコンパイラで動作するかもしれませんが、必須ではありません(Visual C++ 2010、g ++ 4.5.1、およびClang 3.0はすべて' LL 'なしでコードを受け入れます)。 –
@James、面白いです。 g ++ 4.4.3に関する警告が出ます。おそらく、これらのコンパイラはまだC++ 11と互換性がないのですか? –