int c;
long long sum=0;
sum+=c*(c-1)/2;
なぜc = 100000、なぜ合計が正解を得ることができませんか? 私は 合計+ =(長いロング)(c *(c-1)/ 2)を書きますか?なぜ整数エラーを使用するのですか?長い長い権利
int c;
long long sum=0;
sum+=c*(c-1)/2;
なぜc = 100000、なぜ合計が正解を得ることができませんか? 私は 合計+ =(長いロング)(c *(c-1)/ 2)を書きますか?なぜ整数エラーを使用するのですか?長い長い権利
int
ここで私は -の最大範囲を超える100000平方(10E9)を想定しています。以下は動作します - c
の最初のインスタンスをlong long
にキャスティングすると、残りの式は "long long compatible"になります。
sum+=((long long)c*(c-1)/2);
あなたの質問では、整数として宣言されています。式c *(c-1)の整数自体の限界を横切る。 UBの背後にある理由を暗黙的にlong longに変換する前にオーバーフローが発生します。
uは暗黙的にlong longの中にそれを変換したときにuが正しい答えをGERます一方...
はありがとう、私know.Though合計は、長い長い、最初のC *(C-1)/ 2は(int型ですオーバーフローしています)、その後長く変更されます。 – outsiders
私の喜び - そうです、+ =の右辺はintとして評価されるので、オーバーフローはlong longにキャストされる前に発生します。 –