मैं एक एनएसआईएनटेगर को एनएसयूइंटर में बदलने की कोशिश कर रहा हूं और मैंने इसे गुगल किया और कोई वास्तविक जवाब नहीं मिला। यह मैं कैसे करूंगा?एनएसआईएनटेगर को NSUInteger में कनवर्ट करें?
उत्तर
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;
चूंकि यह इस मुद्दे पर आने वाले अन्य लोगों के लिए उपयोगी हो सकता है, यह एक छोटी सी तालिका है जो आपको कास्टिंग का वास्तविक प्रभाव दिखाती है। ये मान सीधे डीबगर से हेक्स मानों के रूप में लिया गया था। तदनुसार चुनें, जैसा कि आप देख सकते हैं कास्टिंग प्रभाव का कारण बनता है। 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
आप कुछ कर रहे हैं कि आपके NSInteger
से अधिक या शून्य के बराबर है, तो आप बस इसे NSUInteger
के रूप में डाली। आपको NSUInteger
पर कास्टिंग नहीं करना चाहिए यदि आपका NSInteger
एक नकारात्मक संख्या का प्रतिनिधित्व करता है, क्योंकि इससे असंगतता हो सकती है।
NSInteger signedInteger = -30;
NSUInteger unsignedInteger = (NSUInteger)signedInteger;
परिणाम
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
}
।ज '#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; ' –
आप एक अहस्ताक्षरित पूर्णांक के लिए एक पूर्णांक कन्वर्ट करने के लिए इच्छुक रहे हैं, तो में, आप कर रहे हैं या तो एक स्थिति है जहाँ आप जानते हैं कि पूर्णांक नकारात्मक कभी नहीं होगा में , या आप सभी नकारात्मक मानों को पूर्ण मानों में परिवर्तित करना चाहते हैं (यानी, हस्ताक्षरित मान)। एक निरपेक्ष मान को यह रूपांतरण करने से स्पष्ट है:
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;
ग्रेटज़ी, कोड के आपके दूसरे छोटे कोड ने मेरे लिए काम किया! –
एक हस्ताक्षरित int खतरनाक int पर हस्ताक्षर नहीं कर रहा है? मैंने पढ़ा है कि भ्रष्टाचार का कारण बन सकता है क्योंकि हस्ताक्षर बिट को बिना हस्ताक्षर किए गए इट्स में मान के रूप में व्याख्या किया जा सकता है? या सी को ऐसा करने से रोकने के लिए सभी काम करता है? NSObjCRuntime में –