【问题标题】:Converting 64 bit integer to 32 bit on a 32 bit PHP installation?在 32 位 PHP 安装上将 64 位整数转换为 32 位?
【发布时间】:2014-03-04 22:15:51
【问题描述】:

我正在制作一个需要使用Steam API 的网站。但是,我在 PHP 中将 64 位整数转换为 32 位时遇到问题。

我看到另一个帖子,答案是here,这导致我使用此代码:

$y = 76561197998705985;

$x = $y & 0xffffffff;

echo $x;

但是,由于我使用的是仅安装 32 位的 xampp,因此我得到的结果是 1 不正确(38440256 而不是 38440257)。

我在上面链接的另一篇文章提到使用 PHP GMP 扩展在 32 位安装上进行转换,但是通过官方文档 here,我认为对于这类事情的新手来说没有任何有用的指导。

我们将不胜感激一些澄清/帮助!

【问题讨论】:

    标签: php 32bit-64bit


    【解决方案1】:

    你试过示例代码吗?

    $and = gmp_and("0xffffffff", "76561197998705985");
    echo gmp_strval($and) . "\n";
    
    #Convert back to int
    $asInt = gmp_intval($and);
    

    【讨论】:

    • 称我为愚蠢,但我收到此错误Fatal error: Call to undefined function gmp_and() in C:\xampp\htdocs\DotaTestPhps\TestArrayLoop.php on line 3 - 我是否错过了启动gmp_and 函数的步骤?
    • 您的 php.ini 中更有可能没有启用 gmp:查找 ;extension=php_gmp.dll 并确保它没有被注释掉,如果需要,在启用后重新启动您的网络服务器
    • @MarkBaker 啊,谢谢。我取消注释但忘记重新启动网络服务器。代码有效!
    • 我想问一下,那我怎么把gmp数转回正整数呢?
    【解决方案2】:

    我怀疑这是一个浮点舍入问题,一旦一个数字超过PHP_INT_MAX,它将被默默地转换为浮点数,因此会丢失精度,请参阅这个关于 64 位 PHP 的示例:

    php> PHP_INT_MAX
    int(9223372036854775807)
    php> 9223372036854775807
    int(9223372036854775807)
    php> 9223372036854775807 + 1
    double(9.2233720368548E+18)
    

    您必须将您的号码存储为字符串以避免此问题。

    【讨论】:

    • 那么在 64 位和 32 位之间转换的唯一答案是将其存储为字符串?我看到的建议但不知道的方法怎么样,PHP GMP 扩展?
    • @k4kuz0 GMP 在内部使用字符串/资源,输入必须是字符串,否则您已经失去了精度。
    • 我明白了。关于如何做到这一点的任何帮助?到目前为止,我所知道的从另一篇文章中所能获得的。我不知道如何使用 GMP,而且文档似乎没有太大帮助(至少对我而言)。
    • @k4kuz0 查看您链接的手册页中的示例。我建议稍微摆弄一下函数来感受一下。
    猜你喜欢
    • 1970-01-01
    • 2013-03-11
    • 2021-01-22
    • 2014-09-11
    • 2014-03-14
    • 2012-03-19
    • 1970-01-01
    • 2019-08-17
    • 2017-08-06
    相关资源
    最近更新 更多