我们有一些整数算术运算,由于历史原因,它必须在PHP上与一些静态类型语言相同。自从我们上次升级PHP以来,整数溢出的行为已经发生了变化。基本上,我们使用以下公式:
function f($x1, $x2, $x3, $x4)
{
return (($x1 + $x2) ^ $x3) + $x4;
}
然而,即使进行了转换:
function f($x1, $x2, $x3, $x4)
{
return intval(intval(intval($x1 + $x2) ^ $x3) + $x4);
}
我仍然得到完全错误的数字...
例如,对于$x1 = -1580033017,$x2 = -2072974554,$x3 = -1170476976和$x4 = -1007518822,我在PHP中得到-30512150,在C#中得到1617621783。
仅仅将$x1和$x2相加并不能得到正确的答案:
在C#中,我得到
(-1580033017 + -2072974554) = 641959725
在PHP中:
intval(intval(-1580033017) + intval(-2072974554)) = -2147483648
这与以下代码相同:
intval(-1580033017 + -2072974554) = -2147483648
我不介意编写一个"IntegerOverflowAdd"函数或其他什么,但我无法弄清楚(-1580033017 + -2072974554)等于641959725。 (我确实认识它是-2147483648 +(2 * 2 ^ 31),但是-2147483648 + 2 ^ 31是-1505523923,大于Int.Min,那么为什么要加2 * 2 ^ 31而不是2 ^ 31?)
任何帮助将不胜感激...