ANSI C或ISO C是否指定-5%10应该是什么?

Cha*_*ens 19 c c99 modulo c89

我似乎记得ANSI C没有指定当模运算符的操作数为负时应该返回什么值(只是它应该是一致的).它是否稍后被指定,或者是否总是被指定并且我记得不正确?

ken*_*ytm 40

C89,不完全(§3.3.5/ 6).它可以是-5或5,因为-5/10可以返回0或-1(%根据涉及的线性方程定义/,*+):

当整数被划分并且除法不精确时,如果两个操作数都是正的,则/运算符的结果是小于代数商的最大整数,并且%运算符的结果是正的. 如果任一操作数为负,则/运算符的结果是小于代数商的最大整数还是大于代数商的最小整数是实现定义的,这是%运算符结果的符号.如果商a/b可表示,则表达式(a/b)*b + a%b应相等a.

C99,是(§6.5.5/ 6),结果必须是-5:

当整数被划分时,/运算符的结果是代数商,丢弃任何小数部分.88)如果商a/b是可表示的,则表达式(a/b)*b + a%b应相等a.

88)这通常被称为"截断为零".


类似地,在C++ 98中,结果是遵循C89定义的实现定义(第5.6/4节),但提到了圆向零规则是首选,

...如果两个操作数都是非负的,那么余数是非负的; 如果没有,余数的符号是​​实现定义的74).

74)根据正在进行的ISO C修订工作,整数除法的首选算法遵循ISO Fortran标准ISO/IEC 1539:1991中定义的规则,其中商始终向零舍入.

实际上它成为C++ 0x(§5.6/ 4)中的标准规则:

...对于积分操作数,/运算符产生代数商,丢弃任何小数部分; 82 ...

82)这通常被称为截断为零.