2010-03-31 9 views
28

किसी के पास NSUInteger का उपयोग कब और एनएसआईएनटेगर का उपयोग कब करना है, इसकी व्याख्या करने की विशेषज्ञता है?एनएसयूइन्टर बनाम एनएसआईएनटेगर, इंट बनाम हस्ताक्षर किए गए, और इसी तरह के मामले

मैंने कोको विधियों को उन मामलों में भी एनएसआईएनटेगर लौटाया था जहां लौटाया गया मूल्य हमेशा हस्ताक्षरित होगा।

मौलिक कारण क्या है? क्या एनएसआईएनटेगर या int सख्ती से सीमित है यदि हम नकारात्मक मूल्य का प्रतिनिधित्व करना चाहते हैं?

NSObjCRuntime.h से:

#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 

उत्तर

30

तुम भी पूर्णांक रूपांतरण नियमों के बारे में पता है जब बनाम NSInteger NSUInteger के साथ काम किया जाना चाहिए:

उदाहरण के लिए निम्नलिखित टुकड़ा रिटर्न 0 (गलत) आप इसे 1 (सही) मुद्रित करने के लिए उम्मीद थी, हालांकि:

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

कारण यह है कि [si] चर को निश्चित रूप से एक हस्ताक्षरित int में परिवर्तित किया जा रहा है!

इन 'मुद्दों' के आसपास गहन चर्चा के लिए CERT's Secure Coding site देखें और उन्हें कैसे हल करें।

+0

उपयोग की स्थिरता के लिए इस से सहमत हूं यह नया लिंक है https://www.securecoding.cert.org/confluence/display/c/INT02-C.+Understand+integer+conversion+rules –

7

अपने विधि एक उपयुक्त प्रतिबंधित उत्पादन श्रृंखला है, तो आप के रूप में अच्छी NSInteger उपयोग कर सकते हैं, क्योंकि यह टाइप करने के लिए आसान है। जैसा कि आप कहते हैं, यदि आपको ऋणात्मक संख्याएं वापस करने की आवश्यकता है, तो NSInteger शहर में एकमात्र गेम है; अगर मैं किसी कारण से वास्तव में बड़ी संख्या लौटने की आवश्यकता है तो मैं केवल NSUInteger का उपयोग करूंगा।

+1

बड़ी संख्या के लिए, बेस -10 परिशुद्धता के 38 स्थानों के लिए NSDecimalNumber का उपयोग करें। – codewarrior

+0

+1, @ कोडवायरियर, केवल तभी आप कक्षाओं को पार कर सकते हैं, हालांकि। –

+7

मैं दूसरी तरफ जाता हूं: मैं हर समय NSUInteger का उपयोग करता हूं, सिवाय इसके कि जब मुझे नकारात्मक संख्या की आवश्यकता होती है।इसके अलावा, आप वस्तुओं का मतलब है, वर्ग नहीं; कक्षाओं को पारित करने के बहुत कम कारण हैं, और विशेष रूप से NSDecimalNumber क्लास को पास करने के कम कारण भी हैं। –

5

मुझे विशेष रूप से कोको के बारे में पता नहीं है, लेकिन आमतौर पर हस्ताक्षरित पूर्णांक का एकमात्र नुकसान होता है, आमतौर पर उनके पास हस्ताक्षर किए गए int के रूप में अधिकतम आधा अधिकतम मूल्य होता है। 32 बिट सिस्टम के लिए 4 बिलियन की बजाय लगभग 2 बिलियन। आम तौर पर यह एक बड़ा अंतर नहीं है, क्योंकि यदि आप 2 बिलियन के करीब मूल्यों से निपट रहे हैं, तो शायद आप एक ही मामले में 4 बिलियन अधिकतम के बारे में चिंतित होंगे, क्योंकि यह अभी भी एक ओवरफ्लो के करीब है 2 या 3.

हस्ताक्षरित पूर्णांक आमतौर पर प्राथमिकता दी जाती है क्योंकि अतिरिक्त लचीलापन और तथ्य यह है कि एक हस्ताक्षरित पूर्णांक लगभग सभी परिदृश्यों में उपयोग किया जा सकता है, एक हस्ताक्षरित पूर्णांक प्लस सभी अतिरिक्त परिदृश्यों के साथ हो सकता है जहां नकारात्मक की आवश्यकता नहीं होती है।

यदि आप सकारात्मक केवल मूल्यों को लागू करना चाहते हैं तो बिना हस्ताक्षर किए जा सकते हैं।

+0

मैंने एनएसआईएनटेगर और एनएसयूइंटर की परिभाषाओं को जोड़ा। –

+4

हस्ताक्षरित पूर्णांक कभी-कभी तब भी उपयोग किए जाते हैं जब सामान्य श्रेणी सकारात्मक होती है यदि आप एक चर को "अमान्य" मान जैसे -1 को प्रारंभ करने में सक्षम होना चाहते हैं। – progrmr

+3

दिलचस्प बात यह है कि स्विफ्ट, उद्देश्य सी के प्रतिस्थापन, हमेशा संभव होने पर हस्ताक्षरित संख्याओं का उपयोग करने के लिए कहता है। * दस्तावेज़ों से * * केवल यूआईएनटी का उपयोग करें जब आपको विशेष रूप से एक असाइन किए गए पूर्णांक प्रकार की आवश्यकता होती है जो प्लेटफ़ॉर्म के देशी शब्द आकार के समान आकार के साथ होती है। यदि यह मामला नहीं है, तो इंटेल को प्राथमिकता दी जाती है, भले ही मूल्यों को संग्रहीत किया जाए, गैर-ऋणात्मक माना जाता है। इंटीजर वैल्यू एड्स कोड इंटरऑपरेबिलिटी के लिए इंट का निरंतर उपयोग, टाइप नंबर और टाइप इनफरेंस में वर्णित अनुसार, विभिन्न संख्या प्रकारों के बीच कनवर्ट करने की आवश्यकता से बचाता है, और पूर्णांक प्रकार अनुमान से मेल खाता है। – Skotch

17

डिफ़ॉल्ट रूप से, एक पूर्णांक पर हस्ताक्षर किए जाने पर विचार किया जाता है। दूसरे शब्दों में संकलक मानता है कि एक पूर्णांक या सकारात्मक संख्या को स्टोर करने के लिए एक पूर्णांक चर कहा जाएगा। यह सीमा तक सीमित है कि सीमा किसी भी दिशा में पहुंच सकती है। उदाहरण के लिए, 32-बिट int की सीमा 4,294,967,295 है। अभ्यास में, क्योंकि मूल्य सकारात्मक या नकारात्मक हो सकता है, सीमा वास्तव में -2,147,483,648 से +2,147,483,647 है। यदि हम जानते हैं कि ऋणात्मक मूल्य को स्टोर करने के लिए किसी चर को कभी भी नहीं बुलाया जाएगा, तो हम इसे बिना हस्ताक्षरित घोषित कर सकते हैं, जिससे (सकारात्मक) सीमा 0 से +4,294,967,295 तक बढ़ जाती है। तो मैं कहूंगा, एनएसआईएनटेगर का उपयोग करना ठीक है जब आप जानते हैं कि आपके पास सीमित आउटपुट रेंज है। मैं व्यक्तिगत रूप से NSUInteger का उपयोग करता हूं अगर मुझे वास्तव में बड़ी सकारात्मक संख्याएं वापस करने की आवश्यकता होती है तो

+0

अच्छा उत्तर और क्या मुझे पता होना चाहिए :) – mAc

+0

अगर मैं स्टोर करना चाहता हूं -4,294,967,295? मैं तब एनएसआईएनटेगर का उपयोग नहीं कर सकता? – Nil

+0

@ नील लंबे समय तक int: -9,223,372,036,854,775,807 से 9,223,372,036,854,775,807 हस्ताक्षर किए लंबे लंबे int int: 0 से 18,446,744,073,709,551,615। आपके खाते में बहुत बड़ी राशि है: डी –

संबंधित मुद्दे