在C++ 98/03中,可能会有重复的问题:C++ operator % guarantees。
5.6-4
二元运算符/产生商,而二元%运算符产生第一个表达式除以第二个表达式的余数。如果/或%的第二个操作数为零,则行为未定义;否则(a/b)* b + a%b等于a。如果两个操作数都是非负的,则余数为非负的;如果不是,则余数的符号是实现定义的。 在c ++ 11中: 5.6 -4 二进制/运算符产生商,而二元%运算符产生第一个表达式除以第二个表达式的余数。如果/或%的第二个操作数为零,则行为未定义。对于整数操作数,/运算符产生代数商,任何小数部分都被丢弃;如果商a / b可以用结果类型表示,则(a / b)* b + a%b等于a。 正如您所看到的,符号位的实现定义缺失,它会发生什么?
/
运算符行为要求向零截断。这在C99中也是正确的。之前的标准将其留给实现定义。请注意,div()
函数(及其相关函数)始终被指定为向零截断。 - Michael Burr