2011-08-07 20 views

उत्तर

32

NSInteger और NSUInteger सिर्फ आदिम पूर्णांक प्रकार के लिए typedefs हैं:

#if __LP64__ || NS_BUILD_32_LIKE_64 
    typedef long NSInteger; 
    typedef unsigned long NSUInteger; 
#else 
    typedef int NSInteger; 
    typedef unsigned int NSUInteger; 
#endif 

इस तरह के रूप में, आप उन दोनों के बीच "कन्वर्ट" की जरूरत नहीं है। एक साधारण कास्ट पर्याप्त होना चाहिए। पसंद:

NSInteger myInt = 0; 
NSUInteger unsignedInt = (NSUInteger)myInt; 
+0

ग्रेटज़ी, कोड के आपके दूसरे छोटे कोड ने मेरे लिए काम किया! –

+3

एक हस्ताक्षरित int खतरनाक int पर हस्ताक्षर नहीं कर रहा है? मैंने पढ़ा है कि भ्रष्टाचार का कारण बन सकता है क्योंकि हस्ताक्षर बिट को बिना हस्ताक्षर किए गए इट्स में मान के रूप में व्याख्या किया जा सकता है? या सी को ऐसा करने से रोकने के लिए सभी काम करता है? NSObjCRuntime में –

8

चूंकि यह इस मुद्दे पर आने वाले अन्य लोगों के लिए उपयोगी हो सकता है, यह एक छोटी सी तालिका है जो आपको कास्टिंग का वास्तविक प्रभाव दिखाती है। ये मान सीधे डीबगर से हेक्स मानों के रूप में लिया गया था। तदनुसार चुनें, जैसा कि आप देख सकते हैं कास्टिंग प्रभाव का कारण बनता है। 32-बिट के लिए, नीचे ffffffff और 16-बिट लॉप नीचे ffffffffffff से नीचे लूप करें। यह भी ध्यान दें, -1 हमेशा 0xffffffffffffffff है।

NSInteger si = NSIntegerMax; // si NSInteger 0x7fffffffffffffff 
si = -1;      // si NSInteger 0xffffffffffffffff 
si = (NSInteger)-1;    // si NSInteger 0xffffffffffffffff 
si = (NSUInteger)-1;   // si NSInteger 0xffffffffffffffff 
si = NSUIntegerMax;    // si NSInteger 0xffffffffffffffff 
si = (NSInteger)NSIntegerMax; // si NSInteger 0x7fffffffffffffff 
si = (NSUInteger)NSIntegerMax; // si NSInteger 0x7fffffffffffffff 
si = (NSInteger)NSUIntegerMax; // si NSInteger 0xffffffffffffffff 
si = (NSUInteger)NSUIntegerMax; // si NSInteger 0xffffffffffffffff 

NSUInteger ui = NSUIntegerMax; // ui NSUInteger 0xffffffffffffffff 
ui = -1;      // ui NSUInteger 0xffffffffffffffff 
ui = (NSInteger)-1;    // ui NSUInteger 0xffffffffffffffff 
ui = (NSUInteger)-1;   // ui NSUInteger 0xffffffffffffffff 
ui = NSIntegerMax;    // ui NSUInteger 0x7fffffffffffffff 
ui = (NSInteger)NSIntegerMax; // ui NSUInteger 0x7fffffffffffffff 
ui = (NSUInteger)NSIntegerMax; // ui NSUInteger 0x7fffffffffffffff 
ui = (NSInteger)NSUIntegerMax; // ui NSUInteger 0xffffffffffffffff 
ui = (NSUInteger)NSUIntegerMax; // ui NSUInteger 0xffffffffffffffff 
3

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

NSInteger signedInteger = -30; 
NSUInteger unsignedInteger = (NSUInteger)signedInteger; 

परिणाम

integer results

if (unsignedInteger == signedInteger) { 
    // is TRUE 
} 
if (signedInteger == 4294967266) { 
    // is FALSE 
} 
if (signedInteger == -30) { 
    // is TRUE 
} 
if (unsignedInteger == 4294967266) { 
    // is TRUE 
} 
if (unsignedInteger == -30) { 
    // is TRUE 
} 
+0

।ज '#define NSUIntegerMax ULONG_MAX' ' NSLog (@" ULONG_MAX:% लू ", ULONG_MAX);' ' ULONG_MAX: 4294967295' 4294967295-30 + 1 = 4294967266 +1 की वजह से ' NSInteger ui = NSIntegerMax; ' ' ui = -1;' ' ui = (NSUInteger) -1; ' –

0

आप एक अहस्ताक्षरित पूर्णांक के लिए एक पूर्णांक कन्वर्ट करने के लिए इच्छुक रहे हैं, तो में, आप कर रहे हैं या तो एक स्थिति है जहाँ आप जानते हैं कि पूर्णांक नकारात्मक कभी नहीं होगा में , या आप सभी नकारात्मक मानों को पूर्ण मानों में परिवर्तित करना चाहते हैं (यानी, हस्ताक्षरित मान)। एक निरपेक्ष मान को यह रूपांतरण करने से स्पष्ट है:

NSInteger mySignedInteger = -100; 
NSUInteger myUnsignedInteger = fabs(mySignedInteger); 

fabs() एक सी समारोह है कि किसी भी नाव के लिए एक निरपेक्ष मान देता है। यहां, myUnsignedInteger का मूल्य 100 होगा।

ऐसे फ़ंक्शन के लिए संभावित उपयोग केस प्रदर्शित होंगे जहां आप एक अलग प्रारूप में नकारात्मक मान इंगित करेंगे। उदाहरण के लिए, ऋणात्मक संख्याओं लेखांकन में कोष्ठक में प्रदर्शित होते हैं:

NSString * numberForDisplay; 
if (mySignedInteger < 0) { 
    numberForDisplay = [NSString stringWithFormat:@"(%lu)", myUnsignedInteger]; 
} else { 
    numberForDisplay = [NSString stringWithFormat:@"%lu", myUnsignedInteger]; 
} 

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

NSUInteger myUnsignedInteger = mySignedInteger;