gpt4 book ai didi

java - php 64 位整数溢出与 Java 实现不同

转载 作者:行者123 更新时间:2023-12-01 22:48:46 24 4
gpt4 key购买 nike

我正在尝试在 php 中实现 Java 的 Random 类,经过几个小时后,我发现当将两个 64 位长整型相乘时,php 返回的值与 java 的值不同。

在 PHP 中

echo (int) (160577175182 * 25214903917);

给出

9101091335015235584

在 Java 小程序中

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

给出

Java: 9101091335015183990

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

25214903917是java随机魔数(Magic Number)0x5DEECE66D

160577175182 是测试种子值

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

最佳答案

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

PHP 结果与对整数形式的未舍入输入进行乘法,然后将结果转换为 64 位 float 一致。

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

完整产品是 db7e4d92597bf73676

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

Java 结果是 7e4d92597bf73676,即完整乘积的最低有效 64 位。

PHP 乘积为 7e4d92597bf80000,即乘积 double 转换的整数值的最低有效 64 位。

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

关于java - php 64 位整数溢出与 Java 实现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24982058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com