盒子有多大
int 是 32 位盒子,正数极限 INT_MAX = 2147483647(约 21 亿);long long 是 64 位盒子,极限约 9.2e18,容量大约是 int 的 40 亿倍。对 INT_MAX 再加 1,常见机器(补码)上会「回绕」成最小负数 -2147483648——但要记牢:signed 溢出在 C 标准里是未定义行为,可能回绕、可能是垃圾值、甚至可能被编译器优化掉,绝不能依赖。做题前先估「结果最大能到多少」,可能破 21 亿就换 long long。
强转必须在乘之前
10 亿乘 10 亿真实值是 1e18。写 long long s = a * a;(a 是 int)救不了你——a * a 是两个 int 相乘,赋值之前就已经在 int 里溢出了。正确写法是 long long s = (long long)a * a;:先把一个操作数强转成 long long,整个乘法就在 64 位里进行。1e9+7 取模题里 a、b 各自不到 1e9 但乘积接近 1e18,中间乘积同样要先转 long long。
格式符也是溢出坑
C 里独有的一层坑:long long 变量配 %d 读写同样是未定义行为。%d 按 4 字节 int 解析,long long 是 8 字节,读入和打印的值都可能是错的。scanf、printf 一律配 %lld。精确边界可以引 <limits.h> 查 INT_MAX、LLONG_MAX。