小編典典
因此,我解決了這個問題,并發現了很多有關PHP的知識(至少在處理Integer溢出的方式方面)。
1)它完全取決于機器在哪個平臺上運行,哪個版本的PHP,是否運行Suhosin Hardened
PHP以及為多少(32或64)位編譯之間的交叉。6臺計算機的行為符合我的預期(實際上是錯誤的,至少根據他們的文檔是錯誤的),而3臺計算機的行為依舊無法解釋,而3臺計算機的行為則是根據intval命令說的來完成的。文檔。
2)當int>
PHP_INT_MAX(不是int和0xffffffff)時,Intval應該返回PHP_INT_MAX,但這僅在某些版本的PHP4和PHP5上發生。當int>
PHP_INT_MAX時,不同版本的PHP返回不同的值。
3)以下代碼可以返回3個不同的結果(請參見1):
echo "Php max int: ".PHP_INT_MAX."\n";
echo "The Val: ".(-1580033017 + -2072974554)."\n";
echo "Intval of the val: ".intval(-3653007571)."\n";
echo "And 0xffffffff of the val: ".(-3653007571 & 0xffffffff)."\n";
?>
它可以返回(對于Intval似乎正確,但對于&0xffffff則錯誤)
Php max int: 2147483647
The Val: -3653007571
Intval of the val: -2147483648
And of the val: -2147483648
它可以返回(與intval的PHP文檔相矛盾):
Php max int: 2147483647
The Val: -3653007571
Intval of the val: -641959725
And of the val: -641959725
在64位計算機上,它返回(正確):
Php max int: 2147483647
The Val: -3653007571
Intval of the val: -3653007571
And of the val: -641959725
解
無論如何,我需要一個適用于所有這些平臺的解決方案,并且不依賴于使用特定Max
int編譯的特定版本PHP的怪癖。因此,我總結了以下跨PHP的threenTwoBitIntval函數:
function thirtyTwoBitIntval($value)
{
if ($value < -2147483648)
{
return -(-($value) & 0xffffffff);
}
elseif ($value > 2147483647)
{
return ($value & 0xffffffff);
}
return $value;
}
評論
我確實認為PHP的設計師應該說一個Int是32位Int,無論它是在32位,64位還是128位計算機上運行(例如DotNet
CLR),并且沒有將其隨機上轉換為浮動取決于PHP編譯器所依據的位數。
2020-05-19