Как иметь 64-битное целое число на PHP?
Кто -нибудь знает, как иметь 64-битное целое число на PHP? кажется, что это не с помощью файла конфигурации, а скорее это может быть вариант времени компиляции, и это зависит от платформы?
5 ответов
Родные 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).
Обратите внимание, что PHP в Windows вообще не поддерживает 64-битные целые, даже если аппаратное обеспечение и PHP являются 64-битными. Смотрите эту ссылку для деталей:
В Windows x86_64 PHP_INT_MAX - 2147483647. Это связано с тем, что в лежащем в основе c-коде long составляет 32 бита.
Однако в Linux на x86_64 используется 64-битная длина, поэтому PHP_INT_MAX будет 9223372036854775807.
Размер PHP int зависит от платформы. Существует функция unpack(), которая по существу позволяет преобразовывать различные типы данных из двоичных строк в переменные PHP. Кажется, что единственный способ сохранить как 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);
Теперь вы должны получить PHP 7 - полностью совместимую 64-битную поддержку. Не только целые числа, но и все fstat, IO и т. Д. PHP 7 в Windows является истинным 64-разрядным.