如何在PHP中使用64位整数?

62

如何在PHP中使用64位整数?

似乎这不是通过配置文件实现的,而是可能是编译时选项,并且取决于平台。


1
我更希望找到一种“每个整数都是64位解决方案”,因此不想使用大整数模块。 - nonopolarity
1
附注:我在http://tommymontgomery.com/php64找到了一些64位PHP二进制文件。 - Lance Rushing
可能是如何设置PHP以使整数为64位?的重复问题。 - Lightness Races in Orbit
5个回答

83

本机64位整数需要64位硬件和64位版本的PHP。

在32位硬件上:

$ php -r 'echo PHP_INT_MAX;'
2147483647

在64位硬件上:

$ php -r 'echo PHP_INT_MAX;'
9223372036854775807

5
顺便提一下,PHP无法表示无符号整数。因此,上述数字实际上是2的63次方而不是完全可用的无符号整数2的64次方。 - Matt S
请注意,Windows系统上的PHP没有64位整数。"64位平台通常具有约9E18的最大值,除了始终为32位的Windows。" php.net/manual/en/language.types.integer.php - Westy92
32位计算机上可以强制使用64位整数吗? - NickSoft
3
刚刚在64位Windows上测试了最新的PHP 7 RC版本,看起来他们终于终于添加了一致的64位整数支持! - mindplay.dk
就像那个漂亮的例子一样,现在我可以轻松检查我是否有一个64位的二进制文件!之前不知道那个常量。 - Derrek Bertrand
显示剩余4条评论

55

更新:现在已经支持了(在AMD四核、Windows 8.1上测试通过)。

请注意,即使硬件和PHP都是64位的,在Windows上的PHP根本不支持64位整数。有关详细信息,请参见此链接

在Windows x86_64上,PHP_INT_MAX为2147483647。这是因为在底层C代码中,long是32位的。

然而,在x86_64架构的Linux上,使用的是64位的long,因此PHP_INT_MAX将会是9223372036854775807。


3
“it does now”是什么意思?我发现Windows 64的PHP 7支持64位整数。是否有PHP 5.x版本也支持呢?如果有,你从哪里得到的? - Kannan Goundan
我也对如何在Windows上获得64位整数支持感兴趣。 - Mr Pablo
他所指的是PHP 7,这被称为一致的64位支持 - BenMorel
使用 wamp 3.1.0 64位,我能够在x64位的Windows 10机器上获取64位整数。它包括 PHP 7.1.9 - Hanan N.

10

也许您可以使用 GMPBCMath 扩展。


9

PHP的int大小是与平台相关的。有一个名为unpack()的函数,可以将不同类型的数据从二进制字符串转换为PHP变量。似乎唯一的存储64位的方法是将其存储为字符串。

我在以下链接找到了下面的代码: http://www.mysqlperformanceblog.com/2007/03/27/integers-in-php-running-with-scissors-and-portability/

/// portably build 64bit id from 32bit hi and lo parts
function _Make64 ( $hi, $lo )
{

        // on x64, we can just use int
        if ( ((int)4294967296)!=0 )
            return (((int)$hi)<<32) + ((int)$lo);

        // workaround signed/unsigned braindamage on x32
        $hi = sprintf ( "%u", $hi );
        $lo = sprintf ( "%u", $lo );

        // use GMP or bcmath if possible
        if ( function_exists("gmp_mul") )
            return gmp_strval ( gmp_add ( gmp_mul ( $hi, "4294967296" ), $lo ) );

        if ( function_exists("bcmul") )
            return bcadd ( bcmul ( $hi, "4294967296" ), $lo );

        // compute everything manually
        $a = substr ( $hi, 0, -5 );
        $b = substr ( $hi, -5 );
        $ac = $a*42949; // hope that float precision is enough
        $bd = $b*67296;
        $adbc = $a*67296+$b*42949;
        $r4 = substr ( $bd, -5 ) +  + substr ( $lo, -5 );
        $r3 = substr ( $bd, 0, -5 ) + substr ( $adbc, -5 ) + substr ( $lo, 0, -5 );
        $r2 = substr ( $adbc, 0, -5 ) + substr ( $ac, -5 );
        $r1 = substr ( $ac, 0, -5 );
        while ( $r4>100000 ) { $r4-=100000; $r3++; }
        while ( $r3>100000 ) { $r3-=100000; $r2++; }
        while ( $r2>100000 ) { $r2-=100000; $r1++; }

        $r = sprintf ( "%d%05d%05d%05d", $r1, $r2, $r3, $r4 );
        $l = strlen($r);
        $i = 0;
        while ( $r[$i]=="0" && $i<$l-1 )
            $i++;
        return substr ( $r, $i );         
    }

    list(,$a) = unpack ( "N", "\xff\xff\xff\xff" );
    list(,$b) = unpack ( "N", "\xff\xff\xff\xff" );
    $q = _Make64($a,$b);
    var_dump($q);

4

现在您应该获得PHP 7-完全一致的64位支持。不仅整数,而且所有fstat、I/O等都支持64位。Windows上的PHP 7是真正的64位。


我刚刚升级到PHP 7,但64位整数仍然不可用。你有什么想法? - Clifton Labrum
2
克利夫顿,请确保你正在使用64位版本。 - Anatol Belski
是的,事实证明我的Ubuntu服务器只有32位。我不得不升级。 - Clifton Labrum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接