【发布时间】:2021-12-28 17:44:50
【问题描述】:
我正在编写一个(我认为的)是一个实现仿射密码的简单程序,并且遇到了一个问题,即我没有从 C89 中的模数中得到预期的结果。
int main()
{
foo(10);
return 0;
}
int foo(int enc)
{
int a = 5, b = 22, inv_a = 77, result;
result = (inv_a * (enc - b)) % 128;
printf("result = %d = %c\n", result, result);
return result;
}
上面的结果是-28(未定义的行为?)
同时,python中的相同功能:
def foo(enc):
a = 5
b = 22
inv_a = 77
result = (inv_a * (enc - b)) % 128
print(result)
foo(10)
返回我的预期结果 100。在调试过程中,我发现结果与使用模数相同。我不知道的 C 模中发生了什么?
【问题讨论】:
-
它不是未定义的 - 它只是定义与您预期的不同。 (注意 100 和 -28 是全等的 mod 128,所以在某种数学意义上,两者都是“正确的”。)
-
"C modulo" --> C 缺少欧几里得模数:What's the difference between “mod” and “remainder”? 可能有助于理解 C。
标签: c encryption cryptography c89 mod