根据CERT C++ 安全编码标准,模数可以溢出它说:
[...]当被除数等于有符号整数类型的最小(负)值并且除数等于 -1 时,在模运算期间可能会发生溢出。
他们建议采用以下检查方式以防止溢出:
signed long sl1, sl2, result;
/* Initialize sl1 and sl2 */
if ( (sl2 == 0 ) || ( (sl1 == LONG_MIN) && (sl2 == -1) ) ) {
/* handle error condition */
}
else {
result = sl1 % sl2;
}
C++ 标准草案标准部分5.6
乘法运算符第4段说(强调我的):
二元 / 运算符产生商,二元 % 运算符产生第一个表达式除以第二个表达式的余数。如果 / 或 % 的第二个操作数为零,则行为未定义。对于整数操作数, / 运算符产生代数商,并丢弃任何小数部分;81 如果商a/b可以用结果类型表示,(a/b)*b + a%b等于a;否则,a/b 和 a%b 的行为都是未定义的。
CERT 文档的C 版本提供了一些关于如何在某些平台上工作的更多见解,%
并且在某些情况下INT_MIN % -1
可能会产生浮点异常。
/ 的防止溢出的逻辑与上面的 . 的逻辑相同%
。