Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

$ php -r 'echo PHP_INT_MAX;'
2147483647

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

$ php -r 'echo PHP_INT_MAX;'
9223372036854775807

Ответ 2

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

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

В Windows x86_64 PHP_INT_MAX - 2147483647. Это происходит потому, что в базовый c-код, длинный 32 бит.

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

Ответ 3

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

Ответ 4

PHP int size зависит от платформы. Существует функция, называемая 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);

Ответ 5

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