2013-03-26 9 views
6

私はこのコードスニペットに困惑午前:それがあるべきように私はを期待していたなぜこの乗算に整数オーバーフローがありますか?

#include <climits> 
#include <iostream> 
int main(void) { 
    using namespace std; 
    cout << "long max " << LONG_MAX << endl; 
    long x = 2 * 1024 * 1024 * 1024; 
    cout << "2 * 1024 * 1024 * 1024 = " << x << endl; 
    return 0; 
} 

、代わりに私が取得しています。 unsignedを使用することは役に立たないようです。何を与える?

long max 9223372036854775807 
2 * 1024 * 1024 * 1024 = -2147483648 
+0

「1024」と入力すると、すでにデータ型があり、この言語は整数です。したがって、長いデータ型が必要な場合は '1024L'を指定する必要があります。 – eis

答えて

11

L *を追加します。 long x = 2L * 1024L * 1024L * 1024L;、等は、デフォルトでタイプintであり、オーバーフローが前起こる2ため、オーバーフローが発生し

(技術的には、リテラルのタイプlongである限り一つとして他のものはlongに促進される)

割り当て。

異なるリテラルを説明するinteger literalsを参照してください。

+1

そして、符号付きintは '(2^31) - 1'の最大値を持っているので、' 2^31'はそれを1つオーバーフローさせます。 (もっと完全にするため)。 – scones

+0

私は間違いなくアップキャストがそれを世話すると思った、明らかにそうではなかった。 thx – Oliver

+0

@Oliver:オーバーフローは割り当て前に発生します。また、符号付き整数オーバーフローはC++では未定義の動作であることに注意してください。 –

関連する問題