PHP bitsel 32 alanlarda sorunu ve çok sayıda aritmetik işlemler ile kötü sonuçlar değişen bıraktı

3 Cevap php

Ben şu sorunlar var:

Birincisi: Ben, çok sayıda bir 32-bit alanlarda sola kayması yapmaya çalışıyorum, ve olduğu gibi-nedense numarası her zaman iade edilir. Örneğin:

echo(516103988<<32); // echoes 516103988

Boşluk sola bit kaydırma 2 ile çarpımı eşdeğer olduğundan, i ^ 32 2 ile çarpılmasıyla çalıştı ve çalışıyor, bu 2216649749795176448 döndürür.

İkinci olarak: Yukarıdaki noktadan sayısı 9379 eklemek gerekir:

printf('%0.0f', 2216649749795176448 + 9379); // prints 2216649749795185920 

Basmalı: 2216649749795185827

3 Cevap

Pascal Martin önerileri dayanarak, ben BCMath ve GMP uzatma hem denenmiş ve aşağıdaki çözümleri ile geldi:

BCMath ile:

$a = 516103988;
$s = bcpow(2, 32);    
$a = bcadd(bcmul($a, $s), 9379);
echo $a; // works, echoes 2216649749795185827

GMP:

$a = gmp_init(516103988); 
$s = gmp_pow(gmp_init(2), 32); 
$a = gmp_add(gmp_mul($a, $s), gmp_init(9379)); 
echo gmp_strval($a);  // also works

Kimden ne anlıyorum, BCMath sonra sunucuya GMP yüklü olması, bu yüzden ilk çözümünü kullanıyor olacak için çok daha büyük bir şans var.

Teşekkürler :)

PHP tamsayı hassas makine sözcük boyutu (32, 64) ile sınırlıdır. Dizeleri olarak saklayın ve bc veya gmp kütüphane kullanmak zorunda keyfi hassas tamsayılar çalışmak için:

   echo bcmul('516103988', bcpow(2, 32));  // 2216649749795176448

Tamsayılar 32 bit saklanabilir eğilimi gibi yapıyor 32 bit değiştirme işlemleri muhtemelen dışında sizin gibi çalışmaz.

Bu sayfayı Quoying: Bitwise Operators

Don't right shift for more than 32 bits on 32 bits systems.
Don't left shift in case it results to number longer than 32 bits.
Use functions from the gmp extension for bitwise manipulation on numbers beyond PHP_INT_MAX.