首页  >  文章  >  后端开发  >  C/C /Obj-C 中模运算符如何处理负数?

C/C /Obj-C 中模运算符如何处理负数?

Patricia Arquette
Patricia Arquette原创
2024-11-08 03:56:01396浏览

How Does the Modulus Operator Handle Negative Numbers in C/C  /Obj-C?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn