Как иметь 64-битное целое число на PHP?

Кто -нибудь знает, как иметь 64-битное целое число на PHP? кажется, что это не с помощью файла конфигурации, а скорее это может быть вариант времени компиляции, и это зависит от платформы?

5 ответов

Решение

Родные 64-битные целые числа требуют 64-битного оборудования И 64-битной версии PHP.

На 32-битном оборудовании:

$ php -r 'echo PHP_INT_MAX;'
2147483647

На 64-битном оборудовании:

$ php -r 'echo PHP_INT_MAX;'
9223372036854775807

ОБНОВЛЕНИЕ: сейчас (проверено на Amd Quad Core, Windows 8.1).

Обратите внимание, что PHP в Windows вообще не поддерживает 64-битные целые, даже если аппаратное обеспечение и PHP являются 64-битными. Смотрите эту ссылку для деталей:

В Windows x86_64 PHP_INT_MAX - 2147483647. Это связано с тем, что в лежащем в основе c-коде long составляет 32 бита.

Однако в Linux на x86_64 используется 64-битная длина, поэтому PHP_INT_MAX будет 9223372036854775807.

Может быть, вы можете использовать расширение GMP или BCMath.

Размер 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);

Теперь вы должны получить PHP 7 - полностью совместимую 64-битную поддержку. Не только целые числа, но и все fstat, IO и т. Д. PHP 7 в Windows является истинным 64-разрядным.

Другие вопросы по тегам