2011-02-11 28 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讀取了。

相關問題