Tay*_*mon 17 java language-agnostic math integer-overflow
对于三个n位有符号整数a
,b
和c
(例如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
是的,这总是如此.
这是一个属性,因为你有效地做算术模2 ^ 32.Java int
s签名的事实会使事情稍微复杂化(并且意味着您不能假设您通常会使用等效的模运算),但不会影响这种特定的分配属性.
思考实验是考虑使用重复添加来实现它,并考虑当它溢出时会发生什么.由于执行加法的顺序不会影响int
s 的结果(即使有溢出),因此也不会将乘法作为重复加法以不同的顺序进行.并且由于int
乘法总是等于重复加法,因此对于重新排序的乘法,结果也必须相同.QED