一句话理解
整数溢出是结果超出类型能表示的范围,值会绕出去。
为什么要学
溢出经常不报错,只是默默变成错的数,造成 WA。
讲解
int 最大值大约 2e9。再加 1 会变成负数。这就是补码回绕。
最隐蔽的是:long long x = a * b; 若 a、b 是 int,乘法按 int 计算时就已经溢了。
写法:long long x = 1LL * a * b;。比较大小时也可能先加后爆,改成减法比较。
例子
int a = 1000000, b = 1000000;
long long x = a * b;
long long y = 1LL * a * b;
cout << x << " " << y;
x 很可能是溢出后的脏值;y 才是 1e12。
常见错误
- 看到变量类型是 long long 就安心,没看乘法两边。
- 循环里 sum+=a[i] 而 sum 是 int。