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

C++乘法输出异常疑为编译器Bug?为何100000*100000输出1410065408?

为什么 100000 * 100000 输出 1410065408 而不是 10000000000?

这绝对不是编译器的Bug,而是整数溢出导致的经典问题,咱们一步步拆解:

  • 首先,C++里默认的整数常量(比如100000)是int类型,而大多数系统上的int是32位的,它能表示的最大值是2147483647(也就是2^31 - 1,大概21亿)。
  • 当你计算10000 * 10000时,结果是100000000(1亿),这个数远小于21亿,所以能被int正常存储,输出自然正确。
  • 但100000 * 100000的结果是10000000000(100亿),这远远超过了32位int的最大值。此时会发生有符号整数溢出,而C++标准里规定这种行为是未定义行为——不过在大多数编译器(比如GCC、Clang、MSVC)中,会按照补码的循环规则来处理,也就是把结果对2^32取模:
    10000000000 % 4294967296 = 1410065408
    
    这就是你看到的奇怪输出的由来。

怎么解决这个问题?

只需要让计算过程使用更大范围的整数类型就行,比如long long(至少64位,能表示到9e18):

  • 方法一:把其中一个常量显式转换为long long:
    cout << static_cast<long long>(100000) * 100000;
    
  • 方法二:在常量后面加LL后缀,让它变成long long类型:
    cout << 100000LL * 100000;
    

这样计算时会自动提升为long long类型,结果就能正确存储为10000000000了。

内容的提问来源于stack exchange,提问作者DeehoroEjkoli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:15:36