我正在阅读安德鲁·科宁的书C Traps and Pitfalls
中有关C便携性的部分。
在整数divison上
q = a/b;
r = a%b;
如果a是负数,显然提醒 r 可以是负数或正数,同时满足属性
q * b + r == a
如果被分红 a 为负,我通常会认为 r 为负数。这就是我在使用gcc的intel机器中看到的。我很好奇你有没有看到一台机器在股息为负数时会返回正面提示?
答案 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的符号。''此定义适用于所有人 的实施方式。