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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/864058/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 00:08:48  来源:igfitidea点击:

How can I have a 64-bit integer in PHP?

php64-bitinteger

提问by nonopolarity

How can I have a 64-bit integer in PHP?

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

It seems like it is not by a config file, but rather it might be a compile-time option, and it depends on the platform.

似乎它不是通过配置文件,而是它可能是一个编译时选项,它取决于平台。

回答by scotts

Native 64-bit integers require 64-bit hardware AND the 64-bit version of PHP.

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

On 32-bit hardware:

在 32 位硬件上:

$ php -r 'echo PHP_INT_MAX;'
2147483647

On 64-bit hardware:

在 64 位硬件上:

$ php -r 'echo PHP_INT_MAX;'
9223372036854775807

回答by tmont

UPDATE:It does now (tested on AMD quad core, Windows 8.1).

更新:现在可以了(在 AMD 四核、Windows 8.1 上测试)。

Note that PHP on Windows does not support 64-bit integers at all, even if both the hardware and PHP are 64-bit. See this linkfor details:

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

On Windows x86_64, PHP_INT_MAX is 2147483647. This is because in the underlying C code, a long is 32 bit.

However, Linux on x86_64 uses a 64-bit long, so PHP_INT_MAX is going to be 9223372036854775807.

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

但是,x86_64 上的 Linux 使用 64 位长,因此 PHP_INT_MAX 将是 9223372036854775807。

回答by Milen A. Radev

Maybe you could use either the GMPor BCMathextension.

也许您可以使用GMPBCMath扩展。

回答by Josh Curren

PHP int size is platform-dependent. There is a function called unpack() which essentially allows to convert different types of data from binary strings to PHP variables. It seems to be the only way to store as 64 bit is to store it as a string.

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

I found the following code at: http://www.mysqlperformanceblog.com/2007/03/27/integers-in-php-running-with-scissors-and-portability/

我在以下位置找到了以下代码: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);

回答by Anatol Belski

Now you should get PHP 7 - fully consistent 64-bit support. Not only integers, but also all the fstat, I/O, etc. PHP 7 on Windows is true 64-bit.

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