2010-02-21 12 views
5

PHP'nin sol kaydırma işlevinin davranışı hakkında kafam çok karışık. İki farklı makinede (dev ve hosting) kullanıyorum ve bana farklı cevaplar veriyorlar. Bu hesaplamaya onu takip ettik:PHP Soldaki iki farklı makinede iki cevap veriyor.

(-3941404251) << 5;

cevabı -1570884448 alıyorum makine biri Açık; diğer yandan, her iki sistemde de, PHP_INT_MAX = 2147483647. Her iki sistemde de 32 bitlik bir sistem ve ilk 64-bit, fakat php 32 bitlik bir işlem olarak çalışıyor ve yine de aynı cevabı veriyor.

Sadece bunun 32 bit ve 64 bitlik bir problem olduğunu varsayabilirim, ancak istenen davranışı elde etmenin kolay bir yolu var. Biri beni bir işleve veya bir şeye yönlendirirse, bu harika olur.

Teşekkürler!

+0

, ekoyu bu ifadenin önüne koymak aynı şeyi üretir. (konu sorun değil). – Brendon

+0

@Sarfraz: onun kodunu gösterir: '(-3941404251) << 5' ;;; @Brendon: Tanımladığınız şeyi çoğaltıyorum: 0 32 bit ve -1570884448 64 bit –

cevap

2

Sorununuz için ilk değer doğru cevabıdır. Resmi kılavuzda, bit_ operatörü max_int değerinden daha büyük sayılarda kullanamazsınız. Bu yüzden GMP işlevlerini kullanmayı deneyin (Örneğin, http://www.php.net/manual/en/function.gmp-and.php) ve sayıyı bir dize olarak ele alın.

1

Makineler aynı PHP sürümünü kullanıyor mu? (-3941404251) zaten 32 bit imzalı bir değer için çok büyük, bu yüzden "doğru" sonucun undefined olduğundan şüpheleniyorum ve farklı sonuçlar veren farklı sürümler/derlemeler/etc bir hata olarak kabul edilmez.

1

Tam sayı sınırlamalarının üstesinden gelmek için BC Math işlevlerini kullanabilirsiniz. Elq'in GMP işlevi yanıtına bir alternatif ve muhtemelen daha iyi destekleniyor.

İlgili konular