1. ホーム
  2. c++

long long 2147483647 + 1 = -2147483648となるのはなぜですか?重複

2023-11-06 20:58:54

質問

なぜこのコードは同じ数字を表示しないのでしょうか?

long long a, b;
a = 2147483647 + 1;
b = 2147483648;
printf("%lld\n", a);
printf("%lld\n", b);

int変数は4バイトなので、int変数の最大数は2147483647であることは知っています。 しかし、long long変数は8バイトであることは知っていますが、なぜこのコードはそのような動作をするのでしょうか?

どのように解決するのですか?

2147483647 + 1 の和として評価されます。 ints の合計として評価され、オーバーフローします。

2147483648 は大きすぎて int に収まらないので、コンパイラはこれを long (あるいは long long MSVC では ) になります。 したがって、オーバーフローしません。

として和算を行うには long long には適切な定数サフィックスを使用します。

a = 2147483647LL + 1;