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

我似乎记得,当模运算符的操作数是负数(只是它应该是一致的)时,ANSI C没有指定应该返回什么值。 它是后来指定,还是总是指定,我记得不正确?

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

当整数被分割且分割不精确时,如果两个操作数都是正的,则/运算符的结果是小于代数商的最大整数,并且%运算符的结果是正的。 如果任一操作数是负数 ,那么/运算符的结果是小于代数商的最大整数,还是大于代数商的最小整数是实现定义的 ,就像%运算符的结果的符号一样。 如果商a/b是可表示的,则expression式(a/b)*b + a%b将等于a

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

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

88)这通常被称为“截至零”。


类似地,在C ++ 98中,结果是遵循C89定义的实现定义(§5.6/ 4),但是提到了优先selectround-to-zero规则,

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

74)根据正在进行ISO C修订的工作,整数除法的首选algorithm遵循ISO Fortran标准ISO / IEC 1539:1991中定义的规则,其中商总是向零取整。

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

…对于整型操作数,运算符产生的代数商与任何小数部分丢弃; 82

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

为KennyTM的答案增加一点细节:如果C标准调用了某个实现的定义,那么这个实现需要logging它所做的select。 通常这将在编译器或库文档(手册页,帮助手册,打印的文档,CD小册子:-)任何声称符合C89或更高版本的实现必须提供此地方。 尝试寻找这样的文件。 以gcc为例,这是在gcc-info中:

4 C实现定义的行为


ISO C的一致性实现需要在每个被指定为“实现定义”的区域中logging它的行为select。 以下列出了所有这些领域,以及ISO / IEC 9899:1990和ISO / IEC 9899:1999标准的章节编号。 有些地区只能在一个版本的标准中定义。

一些select取决于GCC所遵循的平台的外部确定的ABI(包括标准字符编码) 这些在下面被列为“由ABI确定”。 *注意二进制兼容性:兼容性和“http://gcc.gnu.org/readings.html”。; 预处理器手册中logging了一些select。 *注意实现定义的行为:(cpp)实现定义的行为。 图书馆和操作系统(或编译为独立环境时的其他环境)做出了一些select; 有关详细信息,请参阅其文档。

  • 菜单:

  • 翻译实施::

  • 环境执行::
  • 标识符实现::
  • 字符执行::
  • 整数实现::
  • 浮点执行::
  • 数组和指针的实现::
  • 提示实现::
  • 结构联合枚举和位域实现::
  • 限定符执行::
  • 声明符的实现::
  • 报表执行::
  • 预处理指令的执行::
  • 库函数实现::
  • 架构实现::
  • 特定于区域的行为实施::