首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C和Python -模(%)操作的不同行为

C和Python -模(%)操作的不同行为
EN

Stack Overflow用户
提问于 2009-12-15 13:46:07
回答 6查看 23K关注 0票数 74

我发现,根据所使用的语言,相同的mod操作会产生不同的结果。

在Python中:

代码语言:javascript
复制
-1 % 10

产生9

在C语言中,它生成-1

  1. 哪一个是正确的模组?
  2. 如何使C中的mod操作与Python中的相同?
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-12-15 13:48:13

  1. 这两个变体都是正确的,但是在数学(特别是数论)中,Python的模数是最常用的。
  2. 在C中,您可以使用((n % M) + M) % M来获得与Python相同的结果。例如((-1 % 10) + 10) % 10。注意,对于正整数:((17 % 10) + 10) % 10 == 17 % 10以及C实现的两个变体(正余数或负余数),它仍然是如何工作的。
票数 88
EN

Stack Overflow用户

发布于 2009-12-15 14:11:20

Python有一个“真”模块操作,而C有一个剩余操作。

它与负整数除法的处理方式有直接关系,即向0或负无穷远四舍五入。Python循环为负无穷,C(99)为0,但在两种语言中都是(n/m)*m + n%m == n,因此%运算符必须在正确的方向上进行补偿。

Ada更明确,两者兼具,如modrem

票数 36
EN

Stack Overflow用户

发布于 2009-12-15 14:38:36

在C89/90中,带有负操作数的除法运算符和余数运算符的行为是实现定义的,这意味着取决于实现,您可以得到任何一种行为。它只是要求运营商之间的一致:从a / b = qa % b = r跟随a = b * q + r。在代码中使用静态断言来检查行为,如果行为严重依赖于结果。

在C99中,您观察到的行为已经成为标准行为。

事实上,这两种行为都有一定的逻辑。Python的行为实现了真正的模块化操作。您所观察到的行为是C与向0的舍入一致(也是Fortran行为)。

C中倾向于0舍入的原因之一是,期望-a / b的结果与-(a / b)相同是相当自然的。对于真正的模块化行为,-1 % 10将计算为9,这意味着-1 / 10必须是-1。这可能被认为是相当不自然的,因为-(1 / 10)是0。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1907565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档