我在 python 中有一個代碼,它使用右移,它回傳正確的值,但與我嘗試在 PHP 中右移的方式相同,它回傳 0。
蟒蛇代碼:
print((1640628245535850*0x20c49ba5e353f7cf) >> 64)
// returns 210000415428588
PHP代碼:
$x8 = (1640628245535850*0x20c49ba5e353f7cf);
$x8 = number_format($x8, 0, '', '');
echo $x8 >> 64;
// returns 0
我在數學函式方面的經驗很少,如果有人可以提供幫助,那就太好了。
uj5u.com熱心網友回復:
此運算子>>正在處理整數值,因此運算子的左側將轉換為整數。
根據手冊,整數的最大值約為 9E18。 https://www.php.net/manual/en/language.types.integer.php
而計算 ( 1640628245535850*0x20c49ba5e353f7cf)的第一部分是關于4E33. 所以很明顯PHP不能在整數模式下做這個計算。幸運的是,PHP 會自動在Floating Point模式中進行計算。
但問題是從哪里開始>>使用的。PHP 嘗試轉換~4E33為整數并且會發生溢位。
解決方案是在Floating Point. 在數學上,右移 1 位等于除以 2。所以這段代碼回傳真值:
echo 1640628245535850 * 0x20c49ba5e353f7cf / pow(2,64);
uj5u.com熱心網友回復:
在 8.1.1 版中運行該 PHP 代碼(啟用警告)時,我收到此警告:
已棄用:從浮點字串“3873823918783864565866509837008896”到 int 的隱式轉換會失去精度
這就解釋了。與 Python 不同,PHP 的整數不是大整數,因此當它們不能放入一個單詞中時(取決于平臺),它們會被表示為浮點數(如這里)。這意味著精度會丟失,并且您獲得的位移輸出與 Python 腳本中的數字不同。
如果你想在 PHP 中支持大整數,你可以研究一個擴展,比如GMP。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/394876.html
