为什么C++用for循环计算1到50相乘结果输出为0?
问题原因
- 核心问题是整数类型溢出:你代码中使用的
int类型通常为32位有符号整数,取值范围仅为-2^31 ~ 2^31-1(即-2147483648 ~ 2147483647),而13的阶乘就已经达到6227020800,远超出int的最大值上限。C++标准中规定有符号整数溢出属于未定义行为,后续运算结果本身不具备确定性。 - 最终输出0的直接原因:阶乘运算会持续累积因子2,在主流x86平台的补码实现下,溢出后的数值会被截断到低32位存储,随着乘法运算推进,低32位的二进制位会逐步被0填充,当低32位全为0时,
int变量存储的值就会变为0,后续乘任何整数结果都保持为0,因此最终输出0。
解决建议
- 如果仅需要计算不超过20的阶乘,可以替换为更大的原生整数类型,比如
unsigned long long(64位无符号整数,取值范围0 ~ 18446744073709551615,最多可支持存储20的阶乘)。 - 50的阶乘数值约为
3*10^64,远超过所有常规原生整数类型的存储上限,要计算正确结果需要自行实现大整数运算逻辑,或者接入第三方大整数运算库。
内容的提问来源于stack exchange,提问作者user15826177
相关产品推荐
相关产品推荐

