0

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

3 回答 3

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>
于 2011-02-11T20:24:49.507 回答
0

4653896912 超过 32 位.. 可能会出现不可预测的结果。我得到$a = 43814了 PHP,但实际上是 358929617 >> 13,所以 PHP 很可能正在执行 64 位操作,但 JavaScript 只有 32 位。

于 2011-02-11T19:39:29.587 回答
0

我相信这是因为您a超出了 [PHP][1] 的 32 位有符号整数的限制。

可能的最高价值约为200万,a超过40亿。

当你因为空间限制而滚动时,结果可能是不可预测的(或者至少很难弄清楚)。

如果您的服务器在 64 位版本的 PHP 上,那么它的最大值将远高于此,但 javascript 受最终用户运行的内容的限制。

您可以在他们的整数页面上阅读 PHP 。

于 2011-02-11T19:39:29.913 回答