5

私はgccコンパイラを介してこのコードを実行しようとしていました:

#include <stdio.h>
int main()
{
    unsigned long long int x;
    x = 75000 * 75000;
    printf ("%llu\n", x);
    return 0;
}

しかし、それは間違った出力を与えました。

次に、これを試しました。

#include <stdio.h>
int main()
{
    unsigned long long int x;
    x = (unsigned long long)75000 * (unsigned long long)75000;
    printf ("%llu\n", x);
    return 0;
}

そしてそれは正しい出力を与えました!

なんでそうなの?

4

1 に答える 1

9

75000 * 75000は、2つの整数定数の乗算です。この式の結果も整数であり、オーバーフローする可能性があります。結果はunsignedlonglongに割り当てられますが、すでにオーバーフローしているため、結果は正しくありません。

unsigned long long定数を書き込むには、ULL接尾辞を使用します。

x = 75000ULL * 75000ULL;

これで、乗算はオーバーフローしません。

于 2012-06-17T08:09:24.273 に答える