PHP中32位十六进制数乘法计算结果异常求助
PHP 大整数乘法结果不符的问题原因及解决方法
问题根源:两个32位十六进制数
0xB5365D09与0xDEBC252C相乘后的结果0x9DAA52EA21664A8C,对应十进制值为11213075590466445012,已超出64位带符号整数的最大值(0x7FFFFFFFFFFFFFFF,即9223372036854775807)。PHP处理超出原生整数范围的运算时,会自动将数值转为双精度浮点数,但双精度浮点数仅保留53位有效数字,无法精确表示完整的64位整数,导致低位精度丢失,最终得到截断后的结果0x9DAA52EA21664800,后续的intval()调用进一步固化了这种精度损失。解决方法:使用PHP的大整数扩展处理这类运算,可选方案如下:
- 使用GMP扩展:
<?php $num1 = gmp_init('0xB5365D09', 16); $num2 = gmp_init('0xDEBC252C', 16); $res = gmp_mul($num1, $num2); echo gmp_strval($res, 16); // 输出 9daa52ea21664a8c ?>- 使用BCMath扩展(需将十六进制转十进制字符串运算):
<?php $num1_deci = '2997672201'; // 0xB5365D09的十进制值 $num2_deci = '3740783916'; // 0xDEBC252C的十进制值 $res_deci = bcmul($num1_deci, $num2_deci); // 自定义十进制转十六进制函数 function dec_to_hex($dec) { $hex = ''; do { $remainder = bcmod($dec, '16'); $hex = dechex($remainder) . $hex; $dec = bcdiv($dec, '16', 0); } while ($dec > 0); return $hex; } echo dec_to_hex($res_deci); // 输出 9daa52ea21664a8c ?>
内容的提问来源于stack exchange,提问作者C.E.
相关产品推荐
相关产品推荐

