developer tip

PHP에서 64 비트 정수를 사용하는 방법?

copycodes 2020. 12. 14. 20:04
반응형

PHP에서 64 비트 정수를 사용하는 방법?


누군가 PHP에서 64 비트 정수를 갖는 방법을 알고 있습니까? 구성 파일이 아닌 것처럼 보이지만 컴파일 시간 옵션 일 수 있으며 플랫폼에 따라 다릅니다.


네이티브 64 비트 정수에는 64 비트 하드웨어와 64 비트 버전의 PHP가 필요합니다.

32 비트 하드웨어 :

$ php -r 'echo PHP_INT_MAX;'
2147483647

64 비트 하드웨어 :

$ php -r 'echo PHP_INT_MAX;'
9223372036854775807

업데이트 : 현재 수행됩니다 (Amd Quad Core, Windows 8.1에서 테스트 됨).

Windows의 PHP는 하드웨어와 PHP가 모두 64 비트 인 경우에도 64 비트 정수를 전혀 지원하지 않습니다. 자세한 내용은 다음 링크 를 참조하십시오.

Windows x86_64에서 PHP_INT_MAX는 2147483647입니다. 이는 기본 c- 코드에서 long이 32 비트이기 때문입니다.

그러나 x86_64의 Linux는 64 비트 길이를 사용하므로 PHP_INT_MAX는 9223372036854775807이됩니다.


GMP 또는 BCMath 확장을 사용할 수 있습니다 .


PHP int 크기는 플랫폼에 따라 다릅니다. 본질적으로 이진 문자열에서 PHP 변수로 다양한 유형의 데이터를 변환 할 수있는 unpack ()이라는 함수가 있습니다. 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);

이제 완전히 일관된 64 비트 지원 인 PHP 7을 얻을 수 있습니다. 정수뿐만 아니라 모든 fstat, IO 등. Windows의 PHP 7은 진정한 64 비트입니다.

참고 URL : https://stackoverflow.com/questions/864058/how-to-have-64-bit-integer-on-php

반응형