javascript和php中的相同函数提供不同的输出

javascript和php中的相同函数提供不同的输出,php,javascript,Php,Javascript,javascript中的函数: function int64add(dst, x, y) { var w0 = (x.l & 0xffff) + (y.l & 0xffff); var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16); var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>

javascript中的函数:

function int64add(dst, x, y)
{
    var w0 = (x.l & 0xffff) + (y.l & 0xffff);
    var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
    var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
    var w3 = (x.h >>> 16) + (y.l >>> 16) + (w2 >>> 16);
    dst.l = (w0 & 0xffff) | (w1 << 16);
    dst.h = (w2 & 0xffff) | (w3 << 16);
}
x:

y:

返回:

int64{
    h=-736899889,
    l=-411463152
}
int64{
    h=-736899891,
    l=-411463152
}
在PHP中:

class int64{
    var $h;
    var $l;
    function int64($h,$l){
        $this->h=$h;
        $this->l=$l;
    }
}
    function int64(h,l){
        this.h=h;
        this.l=l;
    }
输入:

dst:

x:

y:

返回:

int64{
    h=-736899889,
    l=-411463152
}
int64{
    h=-736899891,
    l=-411463152
}
php中的int64类:

class int64{
    var $h;
    var $l;
    function int64($h,$l){
        $this->h=$h;
        $this->l=$l;
    }
}
    function int64(h,l){
        this.h=h;
        this.l=l;
    }
js中的函数int64:

class int64{
    var $h;
    var $l;
    function int64($h,$l){
        $this->h=$h;
        $this->l=$l;
    }
}
    function int64(h,l){
        this.h=h;
        this.l=l;
    }

我希望PHP以Javascript的形式提供输出。(Javascript是正确的)

这是因为在PHP中没有正确处理
>
操作符。右移位操作后,应确保使用
&0xffff
清除高位:

$w0 = ($x->l & 0xffff) + ($y->l & 0xffff);
$w1 = (($x->l >> 16) & 0xffff) + (($y->l >> 16) & 0xffff) + (($w0 >> 16) & 0xffff);
$w2 = ($x->h & 0xffff) + ($y->h & 0xffff) + ($w1 >> 16);
$w3 = (($x->h >> 16) & 0xffff) + (($y->l >> 16) & 0xffff) + (($w2 >> 16) & 0xffff);
这样做给了我同样的价值观,但它们与你的不同;可能您的输入值不尽相同(复制粘贴错误?)


正如其他人提到的那样,我会认真考虑使用GMP或BCMask.

什么类型的DST,$X,Y?(对象、数组、字符串…)为什么在PHP的最后两行有$dst?返回值在哪里?所以您不想显示这些输出?$dst->l-正在编辑类的变量并从中返回。如果您愿意放弃此函数并使用PHP扩展,这可能会有所帮助:有一个很好的建议,使用BCMath或gmpcoull请检查此项

$w0 = ($x->l & 0xffff) + ($y->l & 0xffff);
$w1 = (($x->l >> 16) & 0xffff) + (($y->l >> 16) & 0xffff) + (($w0 >> 16) & 0xffff);
$w2 = ($x->h & 0xffff) + ($y->h & 0xffff) + ($w1 >> 16);
$w3 = (($x->h >> 16) & 0xffff) + (($y->l >> 16) & 0xffff) + (($w2 >> 16) & 0xffff);
object(int64)#1 (2) {
  ["h"]=>
  int(1573309647)
  ["l"]=>
  int(-411463152)
}