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

C++中循环变量平方运算溢出问题的原因咨询

为什么修改循环变量类型解决了平方溢出问题

原问题代码(触发溢出)

long long arr[1000000];
int c;
for(int i=2; i<1000000; i++)
{
   arr[c++] = i*i;
}

修改后代码(解决溢出)

long long arr[1000000];
int c;
for(long long i=2; i<1000000; i++)
{
    arr[c++] = i*i;
}

原因详解

在C++中,表达式的运算规则由参与运算的操作数类型决定,和最终赋值的变量类型无关:

  • 当i是int类型时,i*i的计算全程在int类型范围内进行。绝大多数系统里int是4字节,最大值为2147483647,当i大于46340(因为46340²≈2147395600,接近int最大值)时,i*i的结果会超出int的取值范围,触发整数溢出。溢出后的值会按补码规则循环(变成错误的负数或正数),之后再转成long long存入数组,但此时结果已经出错。
  • 当把i改为long long类型后,i*i的计算会以long long类型规则执行。long long通常是8字节,最大值可达9223372036854775807,远大于1000000²=1000000000000,所以计算过程不会溢出,正确结果直接存入数组,问题就解决了。

总结:运算时的类型决定了计算的可用范围,不是看最终要存入的变量类型,而是看参与运算的操作数本身的类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:16:05