int c;
long long sum=0;
sum+=c*(c-1)/2;
當c = 100000時,爲什麼sum不能得到正確答案? 我應該寫 sum + =(long long)(c *(c-1)/ 2);爲什麼使用int錯誤,但long long long
int c;
long long sum=0;
sum+=c*(c-1)/2;
當c = 100000時,爲什麼sum不能得到正確答案? 我應該寫 sum + =(long long)(c *(c-1)/ 2);爲什麼使用int錯誤,但long long long
int
這裏是32位我假設--100000平方(10E9)超過了導致溢出的int
的最大範圍。下面的工作 - 將c
的第一個實例投射到long long
將意味着表達式的其餘部分將「長期兼容」。
sum+=((long long)c*(c-1)/2);
在你的問題中,c被聲明爲整數。所以它在表達式c *(c-1)中越過了整數本身的極限。所以溢出發生。在它被隱式轉換爲long long之前。這就是UB背後的原因。
而當u隱式轉換成很長很長U將GER正確的答案...
謝謝你,我know.Though總和很長很長,第一個C *(C-1)/ 2爲int(所以是溢出),然後它變長很長。 – outsiders
我的榮幸 - 是的,+ =的右邊被作爲int消去,所以溢出發生在它被投射很長時間之前。 –