带括号的强制类型转换疑问:(long)(a*b)是否等价于(long)((int)a*b)?
你的猜测完全正确!
咱们一步步拆解这个问题就清楚了:
运算顺序导致整数溢出:
你写的(long) (a * b)里,括号的优先级最高,所以会先执行a * b的运算。因为a和b都是int类型,乘法会严格按照int的规则计算。100000 × 90000 = 9000000000,而标准32位int的最大值只有2147483647,这时候直接触发了整数溢出——溢出后的值会按2^32取模,结果正好是410065408。溢出后转long无法恢复正确值:
当这个溢出后的int值被强制转换为long时,因为410065408本身在long的取值范围内,所以转换后数值不会发生变化,最终返回的就是410065408,而非预期的9000000000。正确的写法应该这样调整:
要避免这个问题,得先把其中一个操作数转为long,让乘法运算在long的范围内执行:long product_right(int a, int b) { return (long)a * b; }这里
(long)a会把a转为long类型,b会自动被提升为long,两者相乘的结果就是long类型,完全能容纳9000000000这个值,所以输出就是正确的结果。
附你提供的完整代码:
int main(int argc, char *argv[]) { int a = 100000, b = 90000; printf("%ld\n%ld\n", product_wrong(a, b), product_right(a, b)); return 0; } long product_wrong(int a, int b) { return (long) (a * b); }
内容的提问来源于stack exchange,提问作者Guodong Hu
相关产品推荐
相关产品推荐

