溢出要当心

10 分钟

整数类型能表示的范围有限,相加、相乘的结果一旦超出上限,就会"绕回"变成一个莫名其妙的(常是负的)数,这就是溢出int 是 32 位,上限约 (21 亿),两个较大的 int 一乘就可能爆。

int a = 100000, b = 100000;
int c = a * b;                  // 1e10 > 21 亿,溢出!c 变成负数
long long d = (long long)a * b; // 乘之前先转 long long,结果正确 1e10
cout << c << " " << d << "\n";

坑:溢出不报错,只是结果错得离谱,很难一眼看出。判断要不要防:估一下最大可能的中间结果——只要可能超过约 21 亿,就用 long long(上限约 )。特别注意 a * b 里即使 abint,乘法也先按 int 算再赋值,所以要 (long long)a * b 在乘之前就转型,光把结果变量声明成 long long 没用。求和、阶乘、坐标平方这些地方最常溢出。

小纸条

什么情况下要警惕溢出?

登录 后可看答案

溢出要当心 · 考级冲刺 · op599 课程