微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C语言中的Python风格整数除法和模数

如何解决C语言中的Python风格整数除法和模数

在较旧的C标准中没有指定带符号整数除法的舍入方向。但是,在C99中指定将其舍入为零。

这是可移植的代码,适用于所有版本的C标准和cpu架构:

int py_div(int a, int b)
{
  if (a < 0)
    if (b < 0)
      return -a / -b;
    else
      return -(-a / b) - (-a % b != 0 ? 1 : 0);
  else if (b < 0)
      return -(a / -b) - (a % -b != 0 ? 1 : 0);
    else
      return a / b;
}

int py_mod(int a, int b)
{
  if (a < 0)
    if (b < 0)
      return -(-a % -b);
    else
      return -a % b - (-a % -b != 0 ? 1 : 0);
  else if (b < 0)
      return -(a % -b) + (-a % -b != 0 ? 1 : 0);
    else
      return a % b;
}

我做了一些表面测试,结果似乎和Python一样。该代码可能没有最大效率,但是一个好的C编译器可能会充分优化它,特别是如果将代码作为静态函数放在标头中。

解决方法

在Python和Ruby中,有符号整数除法会截断为负无穷大,而有符号整数模数的第二个操作数具有相同的符号:

>>> (-41) / 3
-14
>>> (-41) % 3
1

但是,在C和Java中,有符号整数除法将截断为0,并且有符号整数模数与第一个操作数具有相同的符号:

printf("%d\n",(-41) / 3); /* prints "-13" */
printf("%d\n",(-41) % 3); /* prints "-2" */

用C语言执行与Python和Ruby中相同的除法和模数的最简单,最有效的方法是什么?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。