抛砖引玉
C语言负数除以正数,与正数除以负数或者负数除以负数的余数和商,正负有谁定呢?
-3 / 2 = ?;
-3 % 2 = ?;
3 / (-2) = ?;
3 % (-2) = ?;
(-3) / (-2) = ?;
(-3) % (-2) = ?;
前提假设
假定我们让 a 除以 b,商为 q,余数为 r:q = a / b;r = a % b;这里,不妨假定 b 大于 0。我们希望 a、b、q、r 之间维持怎样的关系呢?
最重的一点,我们希望 q * b + r == a,因为这是定义余数的关系。
如果我们改变 a 的正负号,我们希望这会改变 q 的符号,但这不会改变 q 的绝对值。
当 b>0 时,我们希望保证 r >= 0 且 r < b。
例如,如果余数用于哈希表的索引,确保它是一个有效的索引值很重 。这三条性质是我们认为整数除法和余数操作所应该具备的。很不幸的是,它们不可能同时成立。
举例说明
考虑一个简单的例子:3/2,商为1,余数也为1。此时,第1条性质得到了满足。(-3)/2 的值应该是多少呢?如果满足第2条性质&