2013-02-21 105 views
7

एनएसएनंबर स्टोर करने का सबसे बड़ा मूल्य क्या है?एनएसएनंबर स्टोर करने का सबसे बड़ा मूल्य क्या है?

// ok 
    NSNumber *value = @(1 << 31); 

// gives compiler error, so max NSNumber is 32-bit uint? 
    NSNumber *value = @(1 << 32); 
+5

उत्तर पहले से ही वास्तविक प्रश्न का उत्तर देते हैं, इसलिए मैं त्रुटि की व्याख्या करूंगा। '1' << 32' में' 1' एक int है, और संकलक इसका उपयोग करता है जब यह शिफ्ट करता है। चूंकि एक int 32 बिट्स है, इसलिए आप इसे 32 पदों में स्थानांतरित नहीं कर सकते हैं। यदि आपने '@ (1ULL << 32)' का उपयोग किया है, तो यह काम करेगा, क्योंकि '1ULL' में एक प्रकार का हस्ताक्षर लंबे समय तक है। – ughoavgfhw

+0

धन्यवाद, बहुत अच्छी जानकारी। – Boon

+1

इस सवाल को क्यों वोट दिया जाएगा? नीचे मतदान टोलिंग? – Boon

उत्तर

8

NSNumber वास्तव में एक class cluster है, जिसका अर्थ है जब आप एक उदाहरण बनाने आप ठोस उपवर्गों की एक किस्म, आंकिक प्रकार का एक अलग तरह का भंडारण की प्रत्येक सक्षम के किसी भी हो रही हो सकता है। वास्तविक प्रकार उपलब्ध हैं, और उनके आकार, मशीन-निर्भर हो सकते हैं। दो सबसे बड़े पूर्णांक विकल्पों +numberWithLongLong: (या +numberWithUnsignedLongLong:), जो एक long long संग्रहीत करता है, और +numberWithInteger: (या +numberWithUnsignedInteger:) है, जो एक NSInteger संग्रहीत करता होगा:

NSNumber documentation को देखते हुए आप जो नंबर आप स्टोर कर सकते हैं के विभिन्न प्रकार को दर्शाता है। इसलिए अधिकतम एनएसएनंबर मान इन प्रकारों से सीमित हैं।

फाउंडेशन प्रलेखन राज्यों:

जब 32-बिट अनुप्रयोगों के निर्माण, NSInteger एक 32-बिट पूर्णांक है। 64-बिट एप्लिकेशन एनएसआईएनटेगर को 64-बिट पूर्णांक के रूप में मानता है।

कंपाइलर स्मार्ट है और आपके न्यूमेरिक शाब्दिक के समान प्रकार के एनएसएनंबर बनाएगा। जैसा ऊपर बताया गया है, आप @(1ULL << 32) का उपयोग कर सकते हैं यदि आपकी मशीन में 32 बिट्स से अधिक के साथ unsigned long long प्रकार है।

इसके अलावा, एनएसएनंबर सीएफएनंबर के लिए टोल-फ्री है, जिसका अर्थ है कि आप CFNumberGetByteSize() जैसे कार्यों को आजमा सकते हैं - और CFNumber दस्तावेज़ों के Number Types अनुभाग पर नज़र डालें। आप देखेंगे कि ये मूल रूप से NSNumber विकल्पों के समान हैं।

इसके अतिरिक्त, NSNecimalNumber क्लास, NSNumber का उप-वर्ग, +maximumDecimalNumber विधि प्रदान करता है जिसका उपयोग आप एनएसडीसीमल नम्बर में संग्रहीत अधिकतम मूल्य को खोजने के लिए कर सकते हैं। NSDecimalNumber, और फ़्लोटिंग-पॉइंट प्रकार, पूर्णांक घटने के साथ, पूर्णांक प्रकारों की तुलना में बड़ी संख्या में स्टोर करने में सक्षम हो सकते हैं।

+0

'NSNumber * value = @ (पाउ (2, 128)) के बारे में क्या;'? – Sebastian

+1

@ सेबेस्टियन चूंकि 'पाउ' एक 'डबल' देता है, तो कंपाइलर '+ नंबर विथ डबल:' (या इसके बराबर कुछ) का उपयोग करेगा। – jtbandes

+0

तो यह सबसे बड़ा 'लंबा लंबा' – Sebastian