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

时间:2010-08-31 13:44:05

标签: c c99 modulo c89

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

2 个答案:

答案 0 :(得分:40)

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

  

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

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

  

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

     

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


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

  

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

     

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

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

  

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

     

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

答案 1 :(得分:3)

向KennyTM的答案添加一些细节:如果C标准调用实现定义,则该实现 required 来记录它所做出的选择。通常这将在编译器或库文档中(手册页,帮助手册,印刷文档,CD小册子:-) 任何声称符合C89或更高版本的实现必须在某处提供此功能。 尝试寻找这样的文件。例如,在gcc的情况下,这是在gcc-info:

  

4 C实现定义的行为

     
     

需要符合ISO C的实施文件来记录   在指定的每个区域中选择行为   “实施定义”。以下列出了所有这些区域   使用ISO / IEC 9899:1990和ISO / IEC的章节编号   9899:1999标准。某些区域仅在一个区域中实现定义   标准的版本。

     

某些选择取决于平台的外部确定的ABI   海湾合作委员会遵循的(包括标准字符编码);这些是   在下面列出“由ABI确定”。 *注意二进制兼容性:   兼容性,和`http://gcc.gnu.org/readings.html'。一些选择   记录在预处理器手册中。 *注意   实现定义的行为:(cpp)实现定义的行为。   一些选择是由图书馆和操作系统(或其他   编制独立环境时的环境);参考   他们的文件详细信息。

     
      
  • 菜单:

  •   
  • 翻译实施::

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