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;
}

私は2147483648を期待していたのですが、代わりに取得しています。unsignedを使用しても効果がないようです。何が得られますか?

long max 9223372036854775807
2 * 1024 * 1024 * 1024 = -2147483648
4

1 に答える 1

10

Lいくつかのs*を追加します。long x = 2L * 1024L * 1024L * 1024L;

(技術的には、1つのリテラルがタイプである限りlong、他のリテラルはに昇格されますlong

オーバーフローなどはデフォルト2でタイプであり、割り当ての前にオーバーフローが発生するため、オーバーフローが発生します。int

さまざまなリテラルを説明する整数リテラルを参照してください。

于 2013-03-26T22:53:29.980 に答える