我们有一些整数运算,由于历史原因,它在 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?)
任何帮助,将不胜感激...