0

2つの同一の関数(1つはPHP、もう1つはjavascript)が異なる結果を返すという奇妙な結果が得られています。

これらのコード行の両方の入力は同じです。

a = 4653896912;
b = 13;

変数の種類を再確認しましたが、どちらの変数もJSでは数値でPHPでは整数です。

PHPのコード行は次のとおりです。

$a = $a >> $b;

Javascriptの場合は次のとおりです。

a = a >> b;

両方の後で同じ値になると予想されますが、次のようになります。

PHP: $a = 568102
JS: a = 43814

これは、この時点で私を完全に困惑させました。


これは間違いなく、64ビット整数を使用するPHPと32ビットのみを使用するJSの問題であることがわかりました。私が今直面している問題は、これらの計算に32ビット整数を使用するようにPHPを取得する必要があることです。他の誰かが書いた、動作するはずの関数を見つけましたが、出力はまったく変更されていないようです。

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

4653896912は32ビットを超えています。予測できない結果が生じる可能性があります。私$a = 43814はPHPを入手しましたが、実際には358929617 >> 13であるため、おそらくPHPは64ビット演算を実行していますが、JavaScriptは32ビットのみです。

于 2011-02-11T19:39:29.587 に答える
0

a[PHP][1]の32ビット符号付き整数の制限を超えて いるためだと思います。

可能な最高値は約200万で、a40億を超えています。

スペースの制限のためにロールオーバーしている場合、結果は予測できない可能性があります(または、少なくとも、理解するのが非常に困難です)。

サーバーが64ビットバージョンのPHPを使用している場合、最大値はよりもはるかに高くなりますが、javascriptはエンドユーザーが実行しているものによって制限されます。

PHPの整数ページで読むことができます。

于 2011-02-11T19:39:29.913 に答える
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 に答える