如何在PHP上有64位整数?
有人知道如何在PHP上有64位整数? 它似乎不是通过configuration文件,而是它可能是一个编译时选项,它取决于平台?
本机64位整数需要64位硬件和64位版本的PHP。
在32位硬件上:
$ php -r 'echo PHP_INT_MAX;' 2147483647
在64位硬件上:
$ php -r 'echo PHP_INT_MAX;' 9223372036854775807
更新:它现在(在Amd四核,Windows 8.1上testing)。
请注意,Windows上的PHP根本不支持64位整数,即使硬件和PHP都是64位。 详情请参阅此链接 :
在Windows x86_64上,PHP_INT_MAX是2147483647.这是因为在底层c代码中,long是32位。
但是,x86_64上的linux使用64位长,所以PHP_INT_MAX将是9223372036854775807。
也许你可以使用GMP或BCMath扩展。
PHP int大小是平台相关的。 有一个名为unpack()的函数,它基本上允许将不同types的数据从二进制string转换为PHPvariables。 它似乎是存储为64位的唯一方法是将其存储为一个string。
我在以下代码中find了以下代码: 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等。Windows 7上的PHP 7是真正的64位。