【发布时间】:2008-11-19 02:26:27
【问题描述】:
我们有一些整数运算,由于历史原因,它在 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?)
任何帮助将不胜感激......
【问题讨论】:
标签: c# php integer-overflow