C++03中的5.6/4规定:“如果两个操作数都为非负数,则余数为非负数;否则,余数的符号由实现定义74)。”。
其中Note 74是这样描述的
根据正在进行的ISO C修订工作,整数除法的首选算法遵循在ISO Fortran标准ISO/IEC 1539:1991中定义的规则,其中商总是朝着零舍入。
C++0x规定 -
C++0x中的5.6/4-“对于整型操作数,/运算符产生代数商,并舍弃任何小数部分;79如果商a/b可以在结果类型中表示,则(a/b)*b + a%b等于a。
Note 79说
这通常称为向零截断。
所以我有两个问题:
有人能解释一下“向零截断”的概念吗?
C++0x中使用负操作数进行取模运算是否是已定义的行为?
(A+m)%m==A%m
和(A+d)/d==(A+d)+1
这两个关系比(-A)/B==-(A/B)
更有用。在使用整数运算绘制图形时,将其转换以使0位于窗口中间时,正负数之间的过渡可能会出现非常丑陋的接缝;如果/
运算符向负无穷舍入,则可以避免这样的接缝。请注意,通过向负无穷舍入的除法语义,在对带符号数除以2的幂或取模时速度会更快。 - supercat