You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带括号的强制类型转换疑问:(long)(a*b)是否等价于(long)((int)a*b)?

你的猜测完全正确!

咱们一步步拆解这个问题就清楚了:

  1. 运算顺序导致整数溢出:
    你写的(long) (a * b)里,括号的优先级最高,所以会先执行a * b的运算。因为a和b都是int类型,乘法会严格按照int的规则计算。100000 × 90000 = 9000000000,而标准32位int的最大值只有2147483647,这时候直接触发了整数溢出——溢出后的值会按2^32取模,结果正好是410065408。

  2. 溢出后转long无法恢复正确值:
    当这个溢出后的int值被强制转换为long时,因为410065408本身在long的取值范围内,所以转换后数值不会发生变化,最终返回的就是410065408,而非预期的9000000000。

  3. 正确的写法应该这样调整:
    要避免这个问题,得先把其中一个操作数转为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:02:50