我得到一些奇怪的结果,其中2个相同的函数(一个在PHP中,一个在javascript中)返回不同的结果。
这两行代码的输入完全相同:
a = 4653896912;
b = 13;
我仔细检查了变量类型,两个变量都是JS中的数字和PHP中的整数。
PHP的代码行是这样的:
$a = $a >> $b;
对于Javascript来说就是这样:
a = a >> b;
您希望 a 在两者之后具有相同的值,但我得到以下内容:
PHP: $a = 568102
JS: a = 43814
在这一点上,我完全感到困惑。
事实证明,这绝对是使用64位整数的PHP和仅使用32位的JS的问题。我现在面临的问题是我需要让PHP使用32位整数进行这些计算。我找到了别人写的一个看起来应该可以工作的函数,但它似乎根本没有改变我的输出。
private static function toInt32(&$x) {
$z = hexdec(80000000);
$y = (int) $x;
if($y ==- $z && $x <- $z){
$y = (int) ((-1) * $x);
$y = (-1) * $y;
}
$x = $y;
}
答案 0 :(得分:0)
4653896912超过32位..可能出现不可预测的结果。我得到PHP的$a = 43814
,但实际上是358929617&gt;&gt; 13,所以很可能PHP正在进行64位操作,但JavaScript只有32位。
答案 1 :(得分:0)
我相信这是因为你a
超过了[PHP] [1]的32位有符号整数的限制。
可能的最高值约为200万,a
超过40亿。
当你因空间限制而翻身时,结果可能无法预测(或者至少很难弄清楚)。
如果您的服务器使用的是64位版本的PHP,那么它的最大值将远高于,但javascript受最终用户运行的限制。
您可以在integers page上阅读PHP。
答案 2 :(得分:0)
下面的代码演示了屏蔽数字的高32位,以便只检索计算中使用的低32位。 4294967295是2 ^ 32 - 1.我认为如果你以这种方式屏蔽所有可能大于32位的值,那么你可以从php和javascript中获得相同的结果。
<?php
$php_a = 4653896912;
$php_b = 13;
//convert $php_a into a 32 bit val
$php_a = $php_a & 4294967295;
$a = $php_a >> $php_b;
echo "PHP: \$a = $a <br />";
?>
<script type="text/javascript">
var a = 4653896912;
var b = 13;
var a = a >> b;
alert('Javascript A value is ' + a);
</script>