C++运算符%保证

Ria*_*iaD 20 c++ modulo language-lawyer

难道保证(-x) % m,在这里xm在C++中积极标准(C++ 0x中)为负,等于-(x % m)

我知道它在我知道的所有机器上都是正确的.

Chr*_*ica 11

除了Luchian的回答,这是C++ 11标准的相应部分:

二元/运算符产生商,二元%运算符从第一个表达式除以第二个表达式得到余数.如果/或%的第二个操作数为零,则行为未定义.对于积分操作数,/运算符产生代数商,丢弃任何小数部分; 如果商a/b在结果的类型中是可表示的,则(a/b)*b + a%b等于a.

哪个错过了最后一句话.所以这部分

(a/b)*b + a%b等于a

是唯一依赖的引用,并且这意味着a % ba给定截断行为的情况下将始终具有符号/.因此,如果您的实现在这方面符合C++ 11标准,那么模运算的符号和值确实是为负操作数完美定义的.

  • @RiaD它只是在前面的句子中:*"对于积分操作数,/运算符产生代数商,丢弃任何小数部分"*. (2认同)

Luc*_*ore 7

5.6乘法运算符

4)二进制/运算符产生商,二元%运算符从第一个表达式除以第二个表达式得到余数.如果/或%的第二个操作数为零,则行为未定义; 否则(a/b)*b + a%b等于a.如果两个操作数都是非负的,那么余数是非负的; 如果没有,余数的符号是​​实现定义的(强调我的)

这是来自C++ 03.:(

  • 向零舍入的良好属性当然正是提问者所询问的问题:`(-x) % m == -(x %m)`和`(-x) / m == -(x /米)`。相反,向负无穷大舍入的一个很好的特性是,模数只有“m”个可能的值,并且这些值是模“m”的整数数学环的元素。 (2认同)