在位移时,在PHP和JS中获得不同的结果

时间:2011-02-11 19:26:10

标签: php javascript bit-manipulation bit

我得到一些奇怪的结果,其中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;
}

3 个答案:

答案 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>