web-dev-qa-db-fra.com

comment avoir un entier 64 bits sur PHP?

est-ce que quelqu'un sait comment avoir un entier 64 bits sur PHP? il semble que ce ne soit pas par fichier de configuration mais plutôt que ce soit une option de compilation et cela dépend de la plate-forme?

57

Les entiers natifs 64 bits nécessitent du matériel 64 bits ET la version 64 bits de PHP.

Sur le matériel 32 bits:

$ php -r 'echo PHP_INT_MAX;'
2147483647

Sur le matériel 64 bits:

$ php -r 'echo PHP_INT_MAX;'
9223372036854775807
75
scotts

MISE À JOUR: Il le fait maintenant (testé sur AMD Quad Core, Windows 8.1).

Notez que PHP sous Windows ne prend pas du tout en charge les entiers 64 bits, même si le matériel et PHP sont 64 bits. Voir ce lien pour plus de détails:

Sur Windows x86_64, PHP_INT_MAX est 2147483647. En effet, dans le code C sous-jacent, une longueur est de 32 bits.

Cependant, Linux sur x86_64 utilise une longueur de 64 bits, donc PHP_INT_MAX va être 9223372036854775807.

53
tmont

Vous pouvez peut-être utiliser soit l'extension GMP ou BCMath .

10
Milen A. Radev

La taille de PHP int dépend de la plateforme. Il existe une fonction appelée unpack () qui permet essentiellement de convertir différents types de données de chaînes binaires en variables PHP. Il semble que la seule façon de stocker en 64 bits est de les stocker sous un string.

J'ai trouvé le code suivant sur: 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);
8
Josh Curren

Maintenant, vous devriez obtenir PHP 7 - prise en charge 64 bits entièrement cohérente. Non seulement les entiers, mais aussi tous les fstat, IO, etc. PHP 7 sous Windows est vrai 64 bits.

5
Anatol Belski