web-dev-qa-db-ger.com

Wie kann man eine 64-Bit-Ganzzahl auf PHP haben?

weiß jemand, wie man 64-Bit-Integer auf PHP hat? es scheint so, als ob es sich nicht um eine Konfigurationsdatei handelt, sondern um eine Option zur Kompilierungszeit, die von der Plattform abhängt.

57

Native 64-Bit-Ganzzahlen erfordern 64-Bit-Hardware UND die 64-Bit-Version von PHP.

Auf 32-Bit-Hardware:

$ php -r 'echo PHP_INT_MAX;'
2147483647

Auf 64-Bit-Hardware:

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

UPDATE: Das funktioniert jetzt (getestet auf AMD Quad Core, Windows 8.1).

Beachten Sie, dass PHP unter Windows überhaupt keine 64-Bit-Ganzzahlen unterstützt, auch wenn sowohl die Hardware als auch PHP 64-Bit sind. Siehe dieser Link für Details:

Unter Windows x86_64 lautet PHP_INT_MAX 2147483647. Dies liegt daran, dass im zugrunde liegenden C-Code eine Länge von 32 Bit vorliegt.

Linux unter x86_64 verwendet jedoch eine 64-Bit-Länge, sodass PHP_INT_MAX 9223372036854775807 lautet.

53
tmont

Vielleicht könnten Sie entweder die Erweiterung GMP oder BCMath verwenden.

10
Milen A. Radev

Die PHP-Int-Größe ist plattformabhängig. Es gibt eine Funktion namens unpack (), die es im Wesentlichen ermöglicht, verschiedene Datentypen von binären Zeichenfolgen in PHP Variablen) zu konvertieren. Es scheint die einzige Möglichkeit zu sein, 64-Bit-Daten zu speichern, wenn Sie sie als speichern ein Faden.

Ich fand den folgenden Code unter: 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

Jetzt sollten Sie PHP 7 - voll konsistente 64-Bit-Unterstützung erhalten. Nicht nur Ganzzahlen, sondern auch alle fstat, IO usw. PHP 7 unter Windows ist wahr, 64-Bit.

5
Anatol Belski