2009-03-31 5 views

cevap

23

Tüm vardiyalar, ints için mod 32 ve longs için mod 64 yapılır. section 15.19 of the spec itibaren

:

işlenen int olan sol elin terfi tip, sağ işlenen sadece beş düşük seviyeli bitleri vardiya mesafe olarak kullanılması halinde. Sağdaki işleneni mantıksal AND operatörü & (§15.22.1) maske değeri 0x1f ile bitine tabi tutulmuş gibidir. Gerçekte kullanılan kayma mesafesi, her zaman 0 ila 31, dahil olmak üzere 'dır.

sonra sağ terimin sadece altı düşük seviyeli bitleri kaydırma mesafe olarak kullanılan işlenen long olan, sol-taraf terfi türü. Sağdaki işleneni mantıksal AND operatörü & (§15.22.1) maske değeri 0x3f ile bitine tabi tutulmuş gibidir. Gerçekte kullanılan kayma mesafesi, her zaman 0 ila 63, dahil 'dır.

dil bu şekilde dizayn edilmiştir neden gelince

- Bilmiyorum, ama C# aynı tasarım kararı vardır. İşte açıklamalı ECMA C# Spec diyor:

C# kasıtlı olarak miinimum için uygulama tanımlı davranışları tutar. Yalnızca zorlama davranışının tekdüze davranışının performans etkisinin aşırı olduğu durumlarda kabul edilirler (bazı kayan noktalarda hassaslık sorunları gibi). Bu nedenle, her bir integral türün boyutu, tam olarak belirtilmiş olup, karakter kümesi Unicode'a sabitlenmiş 'dur.

Vardiya işlemleri için, aynı davranış belirtildi. O hafızayı başvuru yapmıyor, özellikle de Modern işlemciler üzerinde sadece küçük bir maliyet gerçekleştirir o tek ekstra talimat (& 0x1F veya & 0x3F) kullanılarak elde olabilir. kayan nokta işlemlerinden farklı olarak, işlemcilerin farkına vararak, kaydırma davranışında farkı, dramatik olacaktır; küçük bir farkından ziyade, tam olarak farklı integral sonuçlar üretilebilecek olacaktır.Bu kararı verirken, numaralı komite, numaralı farklı işlemci sayısı mimarilerinin referans materyallerini inceledi. kayması davranışında tutarlılık var, 32-bit işlenenler için 32 -32 .. + 32 ve 64-bit işlenenler için sırasıyla -64 .. + 64.

(sonra bazı örnekler listesi var.)

Bu benim için tamamen mantıklı bir açıklama gibi görünüyor. Tutarlılık kesinlikle önemlidir ve bazı sistemlerde farklı tutarlı davranışı uygulamak imkansız olursa, bunun makul bir çözüm olduğunu düşünüyorum.

+0

Sanırım 32 bitlik bir int geçişi oldukça anlamsız çünkü sonuç her zaman 0 olur, hayır? – PhiLho

+1

Peki, geçiş yapmak istediğiniz miktar, kullanıcı tanımlı bir değişken olduğunda durum ortaya çıkacaktır. Evet, sadece sayıyı sıfırlamalı, ama sadece 32 bitlik bir kasa için bir kontrol eklemek istemiyorum. – CookieOfFortune

+1

"b> 32? 0: a << b" kullanma * öylesine * kötü ... –

0

İşlemcilerin kaydırma yönergelerini nasıl uyguladıkları konusunda bazı farklar vardır. Örneğin, IIRC, ARM işlemcileri (32-bit ISA), kaydırma yazmacının en az anlamlı baytını alır. (Shiftler aslında ARM ile ilgili tek başına talimatlar değildir).

Alttaki işlemcinin kaydırma için belli belirsiz bir yolu olduğu sürece, vardiya büyüklüğünde ve dalda olup olmadığını kontrol etmek yerine, en önemsiz bitlerin (genellikle bir komut) tümünü temizlemesi daha kolaydır (aslında yalnızca ARM'de) tüm talimatlar koşullu olduğu için genellikle bir talimat ekler).