固定宽度整数是否超过乘法?

Tay*_*mon 17 java language-agnostic math integer-overflow

对于三个n位有符号整数a,bc(例如32位)a * (b + c) == (a * b) + (a * c),考虑到整数溢出,总是这样吗?

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

Duc*_*tro 13

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

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


mik*_*era 6

是的,这总是如此.

这是一个属性,因为你有效地做算术模2 ^ 32.Java ints签名的事实会使事情稍微复杂化(并且意味着您不能假设您通常会使用等效的模运算),但不会影响这种特定的分配属性.

思考实验是考虑使用重复添加来实现它,并考虑当它溢出时会发生什么.由于执行加法的顺序不会影响ints 的结果(即使有溢出),因此也不会将乘法作为重复加法以不同的顺序进行.并且由于int乘法总是等于重复加法,因此对于重新排序的乘法,结果也必须相同.QED