why use int error,but long long right
int c;
long long sum=0;
sum+=c*(c-1)/2;
when c=100000,why sum can't get the right answer? should I write sum+=(开发者_Go百科long long)(c*(c-1)/2);
int here is 32-bit I assume - 100000 squared (10E9) exceeds the maximum range for an int resulting in an overflow. The below would work - casting the first instance of c to long long will mean that the rest of the expression will be "long long compatible".
sum+=((long long)c*(c-1)/2);
Because it is using c as an int in the calculations, and widening it when it's stored.
You need to cast one of the c's to a long long before multiplying.
Also, I suggest you look into using int64_t in place of long long so that you can get the actual type/size you want no matter what (see stdint.h for the various identifiers).
In your question c is declared as integer. so it crosses the limit of integer itself in the expression c*(c-1). so overflow occurs.before it gets implicitly converted into long long.Thats the reason behind UB.
whereas when u implicitly converted it into long long u will ger the right answer...
加载中,请稍侯......
精彩评论