2011-05-21 8 views

答えて

5

intここで私は -の最大範囲を超える100000平方(10E9)を想定しています。以下は動作します - cの最初のインスタンスをlong longにキャスティングすると、残りの式は "long long compatible"になります。

sum+=((long long)c*(c-1)/2); 
+1

はありがとう、私know.Though合計は、長い長い、最初のC *(C-1)/ 2は(int型ですオーバーフローしています)、その後長く変更されます。 – outsiders

+0

私の喜び - そうです、+ =の右辺はintとして評価されるので、オーバーフローはlong longにキャストされる前に発生します。 –

1

それは計算でintとしてcを使用して、それが保存されているときにそれを拡大しているので。

cのいずれかをlong longにキャストしてから乗算する必要があります。

はまた、私はあなたが(さまざまな識別子のstdint.hを参照してください)あなたはどんなたくない実際の種類/サイズを得ることができるようにあなたがlong longの代わりにint64_tを使用してに見てください。

+0

stdint.hを教えていただきありがとうございます – outsiders

1

あなたの質問では、整数として宣言されています。式c *(c-1)の整数自体の限界を横切る。 UBの背後にある理由を暗黙的にlong longに変換する前にオーバーフローが発生します。

uは暗黙的にlong longの中にそれを変換したときにuが正しい答えをGERます一方...