为什么使用int错误,但很长的权利

时间:2011-05-21 03:19:28

标签: c long-integer

int c;
long long sum=0;
sum+=c*(c-1)/2;
当c = 100000时,为什么总和无法得到正确的答案? 我应该写吗?     sum + =(long long)(c *(c-1)/ 2);

3 个答案:

答案 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背后的原因。

而当你隐瞒地把它转换成很长的时间你将会得到正确答案......