int c;
long long sum=0;
sum+=c*(c-1)/2;
当c = 100000时,为什么总和无法得到正确的答案?
我应该写吗?
sum + =(long long)(c *(c-1)/ 2);
答案 0 :(得分:5)
int
这里是32位我假设 - 100000平方(10E9)超过int
导致溢出的最大范围。以下内容可行 - 将c
的第一个实例转换为long long
将意味着表达式的其余部分将“长期兼容”。
sum+=((long long)c*(c-1)/2);
答案 1 :(得分:1)
因为它在计算中使用c
作为int
,并在存储时将其展开。
在乘法之前,您需要将其中一个c
投放到long long
。
此外,我建议您使用int64_t
代替long long
,以便无论如何都可以获得所需的实际类型/尺寸(有关各种标识符,请参阅stdint.h )。
答案 2 :(得分:1)
在你的问题中,c被声明为整数。所以它在表达式c *(c-1)中越过了整数本身的极限。所以溢出发生。在它被隐式转换为long long之前。这就是UB背后的原因。
而当你隐瞒地把它转换成很长的时间你将会得到正确答案......