2009-05-14 35 views
55

Birisi PHP'de 64 bit tam sayıya sahip olmayı biliyor mu? yapılandırma dosyasıyla değil, bir derleme zamanı seçeneği olabilir ve platforma bağlı gibi görünüyor.PHP'de 64 bit tam sayı nasıl?

+1

Bir "her bir tamsayı 64 bit çözüm" için daha fazlasını arıyordum, bu yüzden büyük tamsayı için bir modül kullanmamayı tercih ederim. –

+1

Yan Not: bazı 64-bit PHP ikililer bulundu: [? Tamsayılar 64 bit olacak şekilde PHP kurma özelliklerini ne] arasında http://tommymontgomery.com/php64 –

+0

olası yinelenen (http://stackoverflow.com/questions/870401/what-are-the-specifics-of-setting-up-php-so-that-integers-will-be-64-bit) –

cevap

69

64-bit tamsayı 64 bit donanım VE PHP 64 bit sürümünü gerektirir. 32-bit donanım üzerinde

:

64-bit donanım üzerinde
$ php -r 'echo PHP_INT_MAX;' 
2147483647 

:

$ php -r 'echo PHP_INT_MAX;' 
9223372036854775807 
+0

Günümüzde çoğu yeni PC'nin 64 -bit Windows Vista? Bu gerekli mi? 64-bit işletim sistemi ve daha sonra 64-bit bir PHP sürümünü yükleyin? PHP'nin indirme sayfasında 64-bit bir versiyonu görmedim. birisi bana bunu işaret edebilir mi? "PHP 5.2.1 x64 Projesi" mi? –

+0

Vista'nın özelliklerini bilmiyorum (ancak, evet, 64-bit işletim sistemine ihtiyacınız var). PHP'nin sitesinde değil, bu derlemede bulunan tek derlenmiş ikili dosyalara benziyor. ilk sonuç "64-bit PHP") Googling zaman: http://www.fusionxlan.com/PHPx64.php ve kaynaktan derleyerek eğer, tek bir sürüm var 32-bit ve 64-bit .. – scotts

+0

yukarıda * sadece * x64 donanımı üzerinde "kurulu" bir PHP'nin (resmi olmayan) x64 sürümü üzerinde çalışır. En son resmi 32 bit sürümü bir x64 işletim sistemine sahip olmak ilk sonucu verir (ve yukarıdaki ifadeyi girmek için çift tırnak kullanmanız gerekebilir). – Bil

7

PHP int boyutu, platforma bağlıdır. Unpack() olarak adlandırılan ve temelde ikili dizelerden farklı veri türlerini PHP değişkenlerine dönüştüren bir işlev vardır. 64 bit olarak saklamak için tek yol bir dizge olarak saklamak gibi görünüyor. Belki siz de GMP veya BCMath uzantısını kullanabilirsiniz 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); 
10

:

Ben aşağıdaki kodu bulundu.

50

GÜNCELLEME: Artık (Amd Quad Core, Windows 8.1 üzerinde test) yok. Windows üzerinde PHP hiç 64 bit tamsayı desteklemez

Not donanım ve PHP hem 64 bit bile. Detaylar için this link bakınız: pencereler x86_64 üzerinde

, PHP_INT_MAX yatan c-kodunda, uzun 32 bit olmasıdır 2147483647 olduğunu. Tamamen tutarlı 64bit desteği -

Ancak x86_64'lerde linux PHP_INT_MAX 9223372036854775807.

+3

"Şimdi yapar" ile ne demek istiyorsun? Windows 64 üzerindeki PHP 7'nin 64 bitlik tam sayıları desteklediğini görüyorum. Ayrıca bir PHP 5.x sürümü var mı? Eğer öyleyse, nereden aldın? –

+0

Ayrıca, Windows –

+0

64-bit int destek almak için de ilgileniyorum Şu anda PHP 7 anlamına gelir, bu [Tutarlı 64-bit desteği] olarak adlandırılır (http://php.net/releases/7_0_0. pHP). – Benjamin

5

Şimdi PHP 7 almalısınız olacak kadar uzun bir 64 bit kullanır. Sadece tamsayılar değil, aynı zamanda tüm fstat, IO, vb. Windows üzerinde PHP 7, 64 bittir.

+0

Sadece PHP 7'ye yükseltildim ve 64 bit tamsayılar hala kullanılamıyor. Ne yapabileceğime dair bir fikrin var mı? –

+1

Clifton, 64 bitlik bir yapı kullandığınızdan emin olun. –

+0

Evet, Ubuntu sunucumun sadece 32 bit olduğu ortaya çıkıyor. Yükseltmek zorundaydım. –