C签署的部门

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

在整数divison上

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

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

 q * b + r == a 

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

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-ny定义余数r = x REM y,其中n是最接近x / y精确值的整数; 每当| n – x / y | = 1/2,则n是偶数。 因此,其余部分总是精确的。 如果r = 0,则其符号应为x的符号。 ”这个定义适用于所有实现。