2011-09-12 7 views
8

私の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を試しました。

誰かがこの現象を説明できますか?ありがとう!

答えて

13
long long a = 9223372036854775807LL; 

LLはリテラルを長いロングリテラルにします。それ以外の場合、リテラルはデフォルトで長いリテラルになり、次にaに格納される前にlong longにキャストされます。

+0

@エリック、そうです。彼が投稿に入れた警告を参照してください。コンパイラが自動的にアップグレードされない理由は分かりません。 –

+0

「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 'なしでコードを受け入れます)。 –

+1

@James、面白いです。 g ++ 4.4.3に関する警告が出ます。おそらく、これらのコンパイラはまだC++ 11と互換性がないのですか? –

2

C++言語の前に、C++言語のlong long型がありませんでした。あなたのコンパイラは明らかにC++ 11コンパイラではなく、long longを拡張としてサポートしています。これは、コンパイラが警告を発行する理由です。リテラルが非標準的な(拡張された)方法で解釈されること、つまりリテラルに適切な型を検索する間、コンパイラは言語標準の範囲外になければならないことを警告します。

+0

@ C++ 11。はい、そのとおり。ありがとう! – CppLearner

関連する問題