2010-03-31 24 views
28

NSUInteger'i ne zaman kullanacağını ve NSInteger'i ne zaman kullanacağını açıklayan uzmanlık sahibi var mı?NSUInteger vs NSInteger, int vs unsigned ve benzeri durumlar

ben Kakao yöntemleri bile döndürülen değeri her zaman imzasız olacak durumlarda NSInteger dönen görmüştü.

Temel neden nedir? Negatif değeri temsil etmek istiyorsak NSInteger veya int kesinlikle sınırlı mı? NSObjCRuntime.h itibaren

:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
typedef unsigned long NSUInteger; 
#else 
typedef int NSInteger; 
typedef unsigned int NSUInteger; 
#endif 

cevap

30

NSInteger vs NSUInteger ile uğraşırken Ayrıca tamsayı dönüşüm kurallarının farkında olmalı:

örneğin aşağıdaki parça döndürür 0 (yanlış) bunu 1 (doğru) yazdırmak için beklediğiniz halde:

NSInteger si = -1; 
NSUInteger ui = 1; 
printf("%d\n", si < ui); 

nedeni [si] değişken örtülü işaretsiz int dönüştürülür ediliyor olmasıdır!

bu 'sorunlar' ve bunların nasıl çözüleceği konusunda etrafında derinlemesine bir tartışma için CERT's Secure Coding site bakınız.

+0

Bu yeni bağlantı https://www.securecoding.cert.org/confluence/display/c/INT02-C.+Understand+integer+conversion+rules –

7

senin yöntem uygun bir şekilde kısıtlanmış çıkış aralığı varsa o yazmak daha kolay olur, çünkü siz de NSInteger kullanabilir. Dediğiniz gibi, negatif sayıları döndürmeniz gerekiyorsa, şehirdeki tek oyun olan NSInteger; Herhangi bir nedenle gerçekten büyük sayılara dönmem gerekiyorsa sadece NSUInteger kullanıyorum.

+1

dönmek gerekirse ben şahsen NSUInteger kullanın. – codewarrior

+0

+1, @codewarrior, ancak sınıfları ancak geçebilirsiniz. –

+7

Diğer yoldan gidiyorum: Negatif sayılara ihtiyacım olduğu durumlar dışında NSUInteger'i her zaman kullanıyorum.Ayrıca, nesneleri değil, nesneleri kastediyorsunuz; NSDecimalNumber sınıfını özel olarak geçmek için sınıfları geçmek için çok az neden ve hatta daha az neden vardır. –

5

Özellikle kakao bilmem ama genelde imzalı tamsayı tek dezavantajı genellikle imzasız int olarak yarım maksimum değere sahip olduğunu. 32bit sistemler için 4 milyar yerine 2 milyar gibi. Genel olarak bu büyük bir fark değildir, çünkü eğer 2 milyara yakın değerlerle uğraşıyorsanız, muhtemelen aynı durumda 4 milyarlık bir azami kadar endişeli olabilirsiniz, çünkü sadece bir taşma ile neredeyse bir taşmaya oldukça yakındır. 2 veya 3 çarpımı. İmzalı tamsayılar genellikle tercih edilir, çünkü imzalı bir tamsayı neredeyse tüm senaryolarda kullanılabilir, çünkü imzasız bir tamsayı ek bir esneklik ve bir negatifin gerekli olduğu durumlarda yapamayacağı tüm ek senaryolar olabilir.

Sadece pozitif değerleri uygulamak istiyorsanız, imzasız tercih edilebilir.

+0

NSInteger ve NSUInteger tanımlarını ekledim. –

+4

imzalı tam sayılar, bir değişkeni -1 gibi bir "geçersiz" değerine başlatabilmek istiyorsanız, normal aralık pozitif olsa bile bazen kullanılır. – progrmr

+3

İlginçtir, Swift, Objective C'nin yerine geçen isim, mümkün olduğunda imzalı numaraların her zaman kullanılmasını söylüyor. * Dokümanlardan *: Yalnızca, platformun yerel kelime boyutuyla aynı boyutta imzasız bir tamsayı türüne özellikle ihtiyacınız olduğunda kullanın. Eğer durum böyle değilse, depolanacak değerler negatif olmadığı bilinse bile Int tercih edilir. Tamsayı değerleri için Int'in tutarlı bir kullanımı, kod birlikte çalışabilirliğine yardımcı olur, farklı sayı türleri arasında dönüştürme gereksinimini ortadan kaldırır ve Tür Güvenliği ve Tür Çıkarımında açıklandığı gibi tamsayı tipi çıkarımı ile eşleşir. – Skotch

17

Varsayılan olarak, bir tamsayı imzalı olarak kabul edilir. Başka bir deyişle, derleyici, bir tamsayı değişkeninin, negatif veya pozitif bir sayıyı depolamak için çağrılacağını varsayar. Bu, aralığın her iki yönde de ulaşabileceği ölçüde sınırlar. Örneğin, 32 bit int, 4,294,967,295 aralığına sahiptir. Pratikte, değer pozitif veya negatif olabileceğinden, aralık aslında −2,147,483,648 ila +2,147,483,647'dir. Eğer bir değişkenin hiçbir zaman bir negatif değer saklamak için çağrılmayacağını biliyorsak, onu imzasız olarak ilan edebiliriz, böylece (pozitif) aralığı 0'dan +4,294,967,295'e uzatırız. Yani, kısıtlı bir çıkış aralığınızın olduğunu bildiğiniz zaman NSInteger'i kullanmanın uygun olduğunu söyleyebilirim. Ben 10 tabanlı hassas 38 yerler için NSDecimalNumber kullanın daha da büyük numaraları için gerçekten büyük pozitif yalnızca sayıları

+0

Güzel yanıt ve ne Bilmem gerekiyor :) – mAc

+0

-4,294,967,295'i saklamak istersem ne olur? O zaman NSInteger kullanamaz mıyım? – Nil

+0

@Nil @@ Uzun bir int: -9,223,372,036,854,775,807 ila 9,223,372,036,854,775,807 imzasız uzun uzun int: 0 ila 18,446,744,073,709,551,615. Hesabınızda bulunması oldukça büyük bir tutar: D –

İlgili konular