C/C /Obj-C 中处理负数的模运算符
与数学不同,C 中的模运算符 (%) -当应用于负数时,派生语言表现出不一致的行为。这种差异是由于余数符号的歧义引起的。
实现定义的行为
根据 C 03 标准,当两个操作数均为是否定的是实现定义的。这意味着不同的编译器和平台可能会为 (-1) % 8 和 fmodf(-1, 8) 等操作产生不同的结果。
可靠表达式
无论实现如何,以下表达式都成立:
(a / b) * b + (a % b) == a
该表达式表明被除数 (a) 可以根据商 (a / b) 和余数 (a % b) 重建。
解决方案
确保负操作数行为一致的一种方法是按如下方式计算余数:
<code class="cpp">int mod(int a, int b) { if (b < 0) return -mod(-a, -b); int ret = a % b; if (ret < 0) ret += b; return ret; }</code>
此函数通过以下方式处理负操作数如果 b 为负数,则对两个操作数取反。余数计算为a%b。如果余数为负,则通过加上b的绝对值来调整。这确保了结果是满足上述可靠表达式的非负余数。
这样,mod(-1, 8) 将返回 7,mod(13, -8) 将返回 - 3、秉承预期的数学行为。
以上是C/C /Obj-C 中模运算符如何处理负数?的详细内容。更多信息请关注PHP中文网其他相关文章!