取负数的模数有意义吗?

时间:2011-11-15 05:46:43

标签: integer modulo

我很好奇,因为我们在2年前的代码中发现了一个错误。我们用0x8000初始化了一个16位有符号整数(该平台当然使用2的补码表示为负数)。在一个难以重现的特殊情况下,对该变量执行10的模数以提取十进制表示中的各个数字,同时该值仍为0x8000(-32768)。 -32768%10 == 248这对我们的应用程序毫无意义。

我们的平台是OKI 411微控制器。

我很好奇,虽然在这种情况下采用负数模数没有任何意义,是否有任何现实生活中的例子或实际理由或以某种方式通过取负数的模数获得利益?

1 个答案:

答案 0 :(得分:5)

我需要提供更完整的答案。

正如你所说,数学上有意义(尽管你不需要成为数学家才能理解这一点),但让我澄清一些事情。当我说你对残留物感兴趣时,这是正确的,人们可能会错误地认为正数(a mod n)或负数(-a mod n)数字的残基是相同的,因为人们会天真地下降标志并在否定的情况下进行分裂。当然,你现在知道这是不正确的。您可以通过以下方式考虑它:在计算a mod n时,首先要找出哪个数字n*x(其中x是整数)最接近a而不越过a }。之后,您可以计算n*xa之间的数量。一个例子可能会有所帮助:

假设您想要-282 mod 10,那么10 * -29 = -290最接近-282而不会超过它。然后,您只需计算n*xa之间的数量(即介于290和282之间)。有8个数字,这是你的答案,correct。一方面,对于正数(282 mod 10),最接近282的数字将是10 * 28 = 280(记住,我们不想超过282)。因此,中间有两个数字(也是correct)。

至于应用程序,我不确定一个应用程序特别依赖于计算负数的模数,但Modular arithmetic的整个字段提供了很多应用程序。请参阅上面的Wikipedia链接,了解它们。如果不是因为具有负数的模运算的数学一致性,那么我们最终可能会得到较少的一般定理,这反过来又意味着不那么强大的应用。

关于你的programming困境:

  

当a或n为负时,这个天真的定义就会崩溃   编程语言在定义这些值方面有所不同。虽然   通常使用a和n两者都是整数,许多计算   系统允许其他类型的数字操作数。

另见this