固定宽度的整数在乘法上是分布的吗?

对于三个 n 位有符号整数 、和(如 32 位),考虑到整数溢出,是否总是如此?abca * (b + c) == (a * b) + (a * c)

我认为这是与语言无关的,但如果不是,我对Java的答案特别感兴趣。


答案 1

是的,它成立,因为整数算术是有限环上的模算术。

你可以在这里看到一些理论讨论:https://math.stackexchange.com/questions/27336/associativity-commutativity-and-distributivity-of-modulo-arithmetic


答案 2

是的,这总是正确的

它是一个成立的属性,因为你有效地做了算术模2 ^ 32。Java是有符号的事实使事情稍微复杂化了(这意味着你不能假设你正在做一般的模算术的等价物),但不会影响这个特定的分布属性。int

思想实验是考虑使用重复加法来实现它,并考虑当它溢出时会发生什么。由于执行加法的顺序不会影响带有s的结果(即使溢出),因此以不同的顺序将乘法作为重复加法也不会受到影响。由于乘法总是等同于重复加法,因此对于重新排序的乘法,结果也必须相同。断续器intint