php 64位整数溢出不同于Java impletion

php 64位整数溢出不同于Java impletion,java,php,random,Java,Php,Random,我试图用php实现Java的Random类,经过长时间的几个小时后,我发现当两个64位长相乘时,php返回的值与Java的值不同 在php中 echo (int) (160577175182 * 25214903917); 给予 在Java小程序中 g.drawString( "Java: " + (160577175182L * 25214903917L), 10, 10 ); 给予 有趣的是,如果在程序员模式下将其放入calc,它也会生成9101091335015183990 25214

我试图用php实现Java的Random类,经过长时间的几个小时后,我发现当两个64位长相乘时,php返回的值与Java的值不同

在php中

echo (int) (160577175182 * 25214903917);
给予

在Java小程序中

g.drawString( "Java: " + (160577175182L * 25214903917L), 10, 10 );
给予

有趣的是,如果在程序员模式下将其放入calc,它也会生成9101091335015183990

25214903917是java随机幻数0x5deec66d

160577175182是测试种子值

我知道结果数字大于64位数字,因此两者的结果都不正确。我只需要能够在php中复制java结果。

正确的结果是:

它是一个72位的数字。因此出现了溢出

Java部分是正确的
4048938043477406987894 mod(2^64)=9101091335015183990

php实现可能通过
php_INT_MAX
进行四舍五入,并应给出
9101091335015184428

因此,我的猜测是检查PHP_INT_MAX,并将其用作JAVA实现的一部分

它也可能是回声(int)(160577175182*25214903917)不同于回声(内部)(内部)160577175182*(内部)25214903917

正确的结果是:

它是一个72位的数字。因此出现了溢出

Java部分是正确的
4048938043477406987894 mod(2^64)=9101091335015183990

php实现可能通过
php_INT_MAX
进行四舍五入,并应给出
9101091335015184428

因此,我的猜测是检查PHP_INT_MAX,并将其用作JAVA实现的一部分

它也可能是回声(int)(160577175182*25214903917)不同于回声(内部)(内部)160577175182*(内部)25214903917

正确的结果是:

它是一个72位的数字。因此出现了溢出

Java部分是正确的
4048938043477406987894 mod(2^64)=9101091335015183990

php实现可能通过
php_INT_MAX
进行四舍五入,并应给出
9101091335015184428

因此,我的猜测是检查PHP_INT_MAX,并将其用作JAVA实现的一部分

它也可能是回声(int)(160577175182*25214903917)不同于回声(内部)(内部)160577175182*(内部)25214903917

正确的结果是:

它是一个72位的数字。因此出现了溢出

Java部分是正确的
4048938043477406987894 mod(2^64)=9101091335015183990

php实现可能通过
php_INT_MAX
进行四舍五入,并应给出
9101091335015184428

因此,我的猜测是检查PHP_INT_MAX,并将其用作JAVA实现的一部分


它也可能是回声(int)(160577175182*25214903917)不同于回声(内部)(内部)160577175182*(内部)25214903917

我使用Java中的扩展算术类进行了一些测试,并得出以下结论:

PHP结果与以整数形式对未舍入的输入执行乘法一致,但随后将结果转换为64位浮点

以下结果中的所有数字都是十六进制的,因为更容易看到发生了什么

完整产品是db7e4d92597bf73676

四舍五入到IEEE 754 64位浮点的乘积是db7e4d92597bf80000

Java结果是7e4d92597bf73676,是完整产品的最低有效64位

PHP产品是7e4d92597bf80000,是产品双转换整数值的最低有效64位


我不是PHP专家。PHP是否有扩展的整数数据类型或库?为了得到正确的结果,必须从产品中提取低阶64位,而不首先转换为浮点。

我使用Java中的扩展算术类进行了一些测试,并得出以下结论:

PHP结果与以整数形式对未舍入的输入执行乘法一致,但随后将结果转换为64位浮点

以下结果中的所有数字都是十六进制的,因为更容易看到发生了什么

完整产品是db7e4d92597bf73676

四舍五入到IEEE 754 64位浮点的乘积是db7e4d92597bf80000

Java结果是7e4d92597bf73676,是完整产品的最低有效64位

PHP产品是7e4d92597bf80000,是产品双转换整数值的最低有效64位


我不是PHP专家。PHP是否有扩展的整数数据类型或库?为了得到正确的结果,必须从产品中提取低阶64位,而不首先转换为浮点。

我使用Java中的扩展算术类进行了一些测试,并得出以下结论:

PHP结果与以整数形式对未舍入的输入执行乘法一致,但随后将结果转换为64位浮点

以下结果中的所有数字都是十六进制的,因为更容易看到发生了什么

完整产品是db7e4d92597bf73676

四舍五入到IEEE 754 64位浮点的乘积是db7e4d92597bf80000

Java结果是7e4d92597bf73676,是完整产品的最低有效64位

PHP产品是7e4d92597bf80000,是产品双转换整数值的最低有效64位


我不是PHP专家。PHP是否有扩展的整数数据类型或库?为了得到正确的结果,必须从产品中提取低阶64位,而不首先转换为浮点。

我使用Java中的扩展算术类进行了一些测试,并得出以下结论:

PHP结果与在unrounde上执行乘法是一致的
g.drawString( "Java: " + (160577175182L * 25214903917L), 10, 10 );
Java: 9101091335015183990
private function java_multi($large_a,$large_b)
{
    $mul_str = bcmul($large_a,$large_b);
    $hex = $this->dec2hex($mul_str);
    $hex = substr($hex,-16);
    return (int) $this->hex2dec($hex);
}
function dec2hex($number)
{
    $hexvalues = array('0','1','2','3','4','5','6','7',
               '8','9','A','B','C','D','E','F');
    $hexval = '';
     while($number != '0')
     {
        $hexval = $hexvalues[bcmod($number,'16')].$hexval;
        $number = bcdiv($number,'16',0);
    }
    return $hexval;
}

// Input: A hexadecimal number as a String.
// Output: The equivalent decimal number as a String.
function hex2dec($number)
{
    $decvalues = array('0' => '0', '1' => '1', '2' => '2',
               '3' => '3', '4' => '4', '5' => '5',
               '6' => '6', '7' => '7', '8' => '8',
               '9' => '9', 'A' => '10', 'B' => '11',
               'C' => '12', 'D' => '13', 'E' => '14',
               'F' => '15');
    $decval = '0';
    $number = strrev($number);
    for($i = 0; $i < strlen($number); $i++)
    {
        $decval = bcadd(bcmul(bcpow('16',$i,0),$decvalues[$number{$i}]), $decval);
    }
    return $decval;
}