C签署的部门

时间:2012-04-05 06:07:48

标签: c portability division

我正在阅读安德鲁·科宁的书C Traps and Pitfalls中有关C便携性的部分。

在整数divison上

q = a/b;
r = a%b;

如果a是负数,显然提醒 r 可以是负数或正数,同时满足属性

q * b + r == a

如果被分红 a 为负,我通常会认为 r 为负数。这就是我在使用gcc的intel机器中看到的。我很好奇你有没有看到一台机器在股息为负数时会返回正面提示?

1 个答案:

答案 0 :(得分:9)

C99将其余部分正式化为与股息具有相同的符号。在C99(C89和K& R)之前,它可以采用任何一种方式,因为两种结果都符合技术要求。确实有编译器在这个问题上不符合C99规范,但我不知道有什么不妥。

特别是,第6.5.5节(乘法运算符)声明:

  

¶5/运算符的结果是来自除法的除法的商   第二个第一个操作数; %运算符的结果是   剩余。在两个操作中,如果第二个操作数的值是   零,行为未定。

     

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

     

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

使用这个新定义,其余部分基本上定义为您在数学上所期望的。

修改

为了解决评论中的问题,C99规范指定(脚注240)如果余数为零,则在未签署零的系统上,r的符号将与除数,x。

  

''当y≠0时,无论是什么,都定义余数r = x REM y   通过数学关系r = x-ny进行舍入模式,其中n是   最接近x / y精确值的整数;每当| n - x / y | = 1/2,   然后n是偶数。因此,其余部分总是精确的。 如果r = 0,则为   符号应为x的符号。''此定义适用于所有人   的实施方式。