C++表达式数据类型转换疑问:整数运算的转换顺序
关于C语言中整数运算转换顺序的问题
嘿,这个问题问到点子上了——整数溢出可是C编程里常见的“隐形坑”,搞清楚运算顺序太重要了!
咱们直接说结论:表达式里的乘法和除法会先以int类型完成运算(如果结果超出int范围就会溢出截断),最后才把结果转换为long int赋值给sum。
为什么会这样?这得从C的运算规则说起:
- 因为
n是int类型,n-1的结果也是int类型,所以括号里的n*(n-1)是两个int操作数的乘法,整个运算过程都会保持int类型。 - 哪怕你最后要赋值给
long int类型的sum,也不会改变前面运算的类型——C会先完成整个右侧表达式的计算(全部用int),再把最终的int结果转换为long int存到sum里。
举个实际的例子:假设你的系统里int是32位(最大值是2147483647),如果n = 46341,那n*(n-1) = 46341*46340 = 2147488240,这个数已经超过了32位int的上限,会发生溢出(这在C里属于未定义行为,通常表现为补码截断后变成负数)。接下来除以2得到的还是负数,最后转成long int存到sum里,结果完全不对,但正确的结果应该是1073744120。
那怎么避免这个问题?很简单,只要把其中一个操作数强制转换为long int,就能让整个乘法运算升级为long int类型:
sum = ((long int)n * (n-1))/2;
这里(long int)n会触发寻常算术转换,让n-1也自动提升为long int,乘法和除法都会以long int的精度完成,自然不会溢出,最后赋值给sum的结果就是正确的。
内容的提问来源于stack exchange,提问作者Sainathreddy
相关产品推荐
相关产品推荐

