2011-05-21 120 views

回答

5

int這裏是32位我假設--100000平方(10E9)超過了導致溢出的int的最大範圍。下面的工作 - 將c的第一個實例投射到long long將意味着表達式的其餘部分將「長期兼容」。

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

謝謝你,我know.Though總和很長很長,第一個C *(C-1)/ 2爲int(所以是溢出),然後它變長很長。 – outsiders

+0

我的榮幸 - 是的,+ =的右邊被作爲int消去,所以溢出發生在它被投射很長時間之前。 –

1

因爲它使用c作爲計算的int,並擴大了,它被存儲時。

您需要將c的其中一個投射到long long之前。

此外,我建議你看看使用int64_t來代替long long,這樣你可以得到你想要的實際類型/大小,不管是什麼(見stdint.h各種標識符)。

+0

謝謝你讓我知道stdint.h – outsiders

1

在你的問題中,c被聲明爲整數。所以它在表達式c *(c-1)中越過了整數本身的極限。所以溢出發生。在它被隱式轉換爲long long之前。這就是UB背後的原因。

而當u隱式轉換成很長很長U將GER正確的答案...

相關問題