2011-02-11 55 views
0

我得到了一些奇怪的结果,其中2个相同的函数(一个在PHP中,另一个在javascript中)返回不同的结果。当移位时在PHP和JS中获取不同的结果

两个这些行的代码的输入是相同的:

a = 4653896912; 
b = 13; 

我有双重检查变量类型和两个变量都在JS数和整数在PHP。

对PHP代码行是这样的:

$a = $a >> $b; 

对于JavaScript那就是:

a = a >> b; 

你会想到一个同时具有后相同的值,但我m得到以下:

PHP: $a = 568102 
JS: a = 43814 

这让我完全困惑 在此刻。


原来,这绝对是PHP使用64位整数和JS只使用32位的问题。我现在面临的问题是我需要让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

那么PHP的看起来像'>>'的右边结果是按位右移。 – 2011-02-11 19:39:52

+0

嘿布莱恩,一个整数的大小是平台依赖。看看PHP手册。 http://de3.php.net/integer ...你能提供一些关于你的系统的更多信息吗? 32位? 64位?浏览器类型和你的PHP版本?非常感谢! – BaggersIO 2011-02-11 19:42:58

+0

嘿家伙感谢所有的输入,这绝对是我的服务器是64位的问题。现在的问题是,我需要找到一种方法来强制PHP运行这些计算,同时将其限制为32位整数,以便结果与来自JS的结果匹配。 – Brian 2011-02-11 20:02:28

回答

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> 
0

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

0

我相信这是因为你a高于32位有符号整数为[PHP]中的极限[1]。

可能达到的最高值约为2万元,而且a超过4十亿。

当你滚,因为空间的限制了,结果是不可预知的(或至少,很难弄清楚)。

如果您的服务器上PHP的64位版本,那么它会最大程度的发挥比远远高于,但JavaScript是由最终用户正在运行什么限制。

您可以在自己的integers page对PHP读取了。