64 votes

comment avoir un entier 64 bits sur PHP?

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

85voto

scotts Points 1668

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

Sur du matériel 32 bits:

 $ php -r 'echo PHP_INT_MAX;'
2147483647
 

Sur du matériel 64 bits:

 $ php -r 'echo PHP_INT_MAX;'
9223372036854775807
 

55voto

tmont Points 1240

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 tous deux en 64 bits. Voir ce lien pour plus de détails:

Sur les fenêtres x86_64, PHP_INT_MAX est 2147483647. En effet, dans le code C sous-jacent, la longueur est 32 bits.

Toutefois, Linux sur x86_64 utilise une longueur de 64 bits, donc PHP_INT_MAX sera 9223372036854775807.

10voto

Milen A. Radev Points 20462

Peut-être que vous pourriez utiliser l’extension GMP ou BCMath .

9voto

Josh Curren Points 2993

PHP int taille dépend de la plateforme. Il y a une fonction appelée unpack() qui permet de convertir différents types de données à partir de chaînes binaires à des variables PHP. Il semble être le seul moyen de stocker de 64 bits est de stocker une chaîne de caractères.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X