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的符号。 ”这个定义适用于所有实现。