You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C89中Modulo(%)运算结果与Python不一致是什么原因?

问题根因

这不是未定义行为,是C语言与Python对有符号整数取模运算的规则不同导致的。

首先计算取模前的公共中间值:传入enc=10时,enc - b = 10 - 22 = -12,乘以inv_a=77后得到-924,两边中间值完全一致,差异出现在-924 % 128的计算逻辑上。

取模运算的规则差异

所有取模运算都满足基础公式:

被除数 = 除数 * 商 + 余数

不同语言的差异仅在于商的取整方向:

  • Python的商向负无穷方向取整:-924 / 128 ≈ -7.21875,向负无穷取整得到商为-8,代入公式得余数 = -924 - (128 * (-8)) = 100,就是你预期的结果。
  • C89标准中,有符号整数除法的商取整方向为实现定义,绝大多数编译器默认向0取整:-924 / 128 ≈ -7.21875,向0取整得到商为-7,代入公式得余数 = -924 - (128 * (-7)) = -28,和你C代码的运行结果一致。C99及之后的标准已经明确要求有符号整数除法必须向0取整,该行为是符合标准的合法结果。

修复方案

要在C语言中得到和Python一致的非负余数,只需要对取模结果做一次符号修正即可:

result = (inv_a * (enc - b)) % 128;
// 修正负余数
if (result < 0) {
    result += 128;
}

如果要适配任意模数,可以封装为通用实现:

// 通用非负取模函数,m需为正整数
int positive_mod(int a, int m) {
    int res = a % m;
    return res < 0 ? res + m : res;
}

额外提示:你当前的C代码中foo函数没有在main前做前置声明,在C89标准下会默认按返回int的函数处理,不属于本次问题的原因,但建议补充声明避免编译告警。

内容的提问来源于stack exchange,提问作者Kev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:45:04