You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中32位十六进制数乘法计算结果异常求助

PHP 大整数乘法结果不符的问题原因及解决方法
  • 问题根源:两个32位十六进制数0xB5365D09与0xDEBC252C相乘后的结果0x9DAA52EA21664A8C,对应十进制值为11213075590466445012,已超出64位带符号整数的最大值(0x7FFFFFFFFFFFFFFF,即9223372036854775807)。PHP处理超出原生整数范围的运算时,会自动将数值转为双精度浮点数,但双精度浮点数仅保留53位有效数字,无法精确表示完整的64位整数,导致低位精度丢失,最终得到截断后的结果0x9DAA52EA21664800,后续的intval()调用进一步固化了这种精度损失。

  • 解决方法:使用PHP的大整数扩展处理这类运算,可选方案如下:

    1. 使用GMP扩展:
    <?php
    $num1 = gmp_init('0xB5365D09', 16);
    $num2 = gmp_init('0xDEBC252C', 16);
    $res = gmp_mul($num1, $num2);
    echo gmp_strval($res, 16); // 输出 9daa52ea21664a8c
    ?>
    
    1. 使用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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:15:27