как 64-разрядное целое число на PHP?


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

5 57

5 ответов:

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

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

$ php -r 'echo PHP_INT_MAX;'
2147483647

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

$ php -r 'echo PHP_INT_MAX;'
9223372036854775807

обновление: теперь он работает (протестирован на четырехъядерном процессоре Amd, 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.

может быть, вы могли бы использовать 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-разрядным.