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
'developer tip' 카테고리의 다른 글
lombok을 사용하여 기존 개체에서 개체 만들기 (0) | 2020.12.14 |
---|---|
Unix 명령 줄에서 디렉토리 및 하위 디렉토리의 아카이브를 반복적으로 압축 해제하는 방법은 무엇입니까? (0) | 2020.12.14 |
JPA 구성에서 기본 스키마 이름을 설정하는 방법은 무엇입니까? (0) | 2020.12.14 |
jQuery AJAX 문자 인코딩 (0) | 2020.12.14 |
.gitignore가 작동하지 않습니다. (0) | 2020.12.14 |