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
相关产品推荐
相关产品推荐

