2011-02-17 29 views
8

Sorun açıktır.Qt neden konteyner sınıfları için imzalı bir tamsayı kullanıyor?

Açıkça olumsuz indislerin kendileriyle birlikte kullanılacak kaplarda kullanılamaz hale geldiği için bunun neden kullanışlı olacağını düşündüklerini merak ediyorum (örneğin, QList's docs'a bakın).

Bazı çılgın dizin biçimlerine izin vermek istediklerini sanıyordum, ancak desteklenmiyor gibi görünüyor?

Ayrıca imzalı/imzasız türlerin (MSVC'de) dökümüne ve karşılaştırılmasına ilişkin bir ton (doğru) derleyici uyarısı üretir. Sadece nedense tasarımı ile STL ile uyumsuz görünüyor

...

cevap

4

Çünkü gerçekçi, genellikle negatif olan geçiciri oluşturmak isteyebilirsiniz anlamına gelir endeksleri üzerinde aritmetik gerçekleştirmek istiyoruz. Temeldeki endeksleme türü işaretsiz olduğunda bu açıkça ağrılıdır.

İmzasız sayıları kullanmanın tek uygun zamanı modül aritmetiğidir. "Unsgined" özelliğini bir tür sözleşme belirteci olarak kullanmak "[0 ..." aralığındaki bir sayı sadece hantal ve kullanışlı olmak için çok kaba.

Şunları düşünelim: Sayının, 1 ile 10 arasında pozitif bir tam sayı olması gerektiği fikrini temsil etmek için ne tür bir nesne kullanmalıyım? Neden 0 ... 2^x daha özel bir aralık?

+2

"Yalnızca", oldukça güçlü bir belirticidir. – Sapph

+0

Özel bir durum, [imzalı/imzasız] char'ların bir dizisidir. Bu durumda, modül aritmetiği aynı sonucu iki tamamlayıcı gösterim platformunda ( –

+1

) verir. Daha genel bir noktaya katılıyorum, ancak, imzasız türlerin, doküman olarak yaygın olarak kullanılan rollerinde abartıldığını görüyorum. –

8

Chris'in akıl yürütme çizgisine derinden sempati duymamıza rağmen, ben burada aynı fikirde değilim (en azından kısmen, şeytanın avukatını oynuyorum). Boyutlar için imzasız türlerin kullanılmasında yanlış bir şey yoktur ve hatta bazı durumlarda faydalı olabilir.

Chris'in imzalı boyut türleri için gerekçesi doğal olarak dizi indisleri olarak kullanılmaları ve dizi endekslerinde aritmetik yapmak isteyebilirsiniz ve aritmetik negatif olan geçici değerler oluşturabilir.

Bu iyi ve imzasız bir aritmetik, karşılaştırma yaparken değerlerinizi doğru şekilde yorumladığınızdan emin olduğunuz sürece sorun yaratmaz. İmzasız tamsayıların taşma davranışı tamamen belirtildiği için, negatif aralığa (veya büyük pozitif sayılara) geçici olarak taşan değerler, bir karşılaştırma yapılmadan önce düzeltildikleri sürece herhangi bir hata vermezler. İmzasız aritmetiğin taşma davranışı, belirli aralık kontrollerini, aksi takdirde iki karşılaştırmayı gerektirecek tek bir karşılaştırma olarak ifade edebildiği için, taşma davranışı da istenmektedir. Ben x aralığında [a,b] olduğunu ve tüm değerler imzasız olup olmadığını kontrol etmek istiyorsanız, ben sadece bunu yapabilirsiniz:

imzalı değişkenlerle çalışmıyor
if (x - a < b) { 
} 

; Bu tür aralık kontrolleri boyutları ve dizi ofsetleri ile oldukça yaygındır.

Bundan önce bahsettiğim, bir fayda taşma aritmetiğinin sonuçları tanımladığıdır. Dizin aritmetiğiniz imzalı bir türden taşarsa, davranış tanımlanır; Programınızı taşınabilir hale getirmenin bir yolu yoktur. İmzasız bir tür kullanın ve bu sorun gider. Kuşkusuz bu sadece büyük ofsetleri için geçerlidir, ancak bazı kullanımlar için bir endişe kaynağıdır. Temel olarak, imzasız türlere karşı itirazlar sıklıkla abartılmaktadır.Asıl sorun, çoğu programcının yazdıkları kodun tam anlamını düşünmedikleri ve küçük tamsayı değerleri için, imzalı türlerin sezgileriyle daha yakın davrandıklarıdır. Bununla birlikte, veri boyutları oldukça hızlı büyür. Arabelleklerle veya veritabanlarıyla uğraşırken, genellikle "küçük" aralığın dışında kalırız ve imzalı taşma, imzasız taşma işleminden daha doğru bir şekilde işlemek için çok daha sorunludur. Çözüm "imzasız türler kullanmayın" değil, "yazdığınız kod hakkında dikkatlice düşünün ve anladığınızdan emin olun".

+0

Temsili indekslerle mümkün olan tembel alt akış kontrol stilini gerçekten çok seviyorum. –

+0

+1 (x - a user763305

İlgili konular