2011-04-20 16 views
12

जैसे सामान्य प्रश्न के लिए क्षमा करें, लेकिन क्या सबसे अच्छा है (के रूप में तेजी से संभव है और सबसे सुरक्षित के रूप में) विधि:उद्देश्य सी कास्टिंग पूर्णांक ObjC में फ्लोट करने के लिए पूर्णांक परिवर्तित करने के लिए फ्लोट करने के लिए

पहले

int b = 10; 
float a = [[NSNumber numberWithInt: b] floatValue] 

NSNumber उदाहरण और संदेश numberWithInt, floatValue भेजे जाएंगे, है ना?

दूसरा

int b = 10; 
float a = (float) b; 

सी-शैली: कॉल कुछ सबरूटीन के साथ इस?

या कोई अन्य तरीका?

और क्यों?

+0

कास्ट का प्रयोग करें। यह एक subroutine नहीं बुलाता है। संकलक सुनिश्चित करेगा कि सही असेंबली कोड का उपयोग किया जाता है। – hooleyhoop

+5

कास्ट का उपयोग न करें। एक सादा 'फ्लोट ए = बी;' पर्याप्तताएं। – pmg

उत्तर

12

सी-शैली प्रकार कास्ट पढ़ने के लिए सबसे स्पष्ट और आसान है। अगर मुझे ऐसा कोड मिल गया जो NSNumber ऑब्जेक्ट को सिर्फ रूपांतरण करने के लिए बनाया गया, तो यह मुझे आश्चर्यचकित कर देगा "उसने ऐसा क्यों किया? क्या कुछ सादा पुराने प्रकार के रूपांतरण के अलावा कुछ हो रहा है? मुझे क्या याद आ रही है? "

गति के लिए, मुझे संदेह है कि सरल प्रकार का रूपांतरण भी तेज होगा - NSNumber ऑब्जेक्ट को रूपांतरण करने के लिए बहुत अधिक संचालन करने की आवश्यकता होगी, और इसके ऊपर ऑब्जेक्ट सृजन और संदेश का अतिरिक्त ओवरहेड होगा उस। लेकिन जैसा कि सभी मामलों में, अनुमान नहीं है - उपाय। यह देखने के लिए अपना कोड प्रोफाइल करें कि रूपांतरण एक बाधा है जो आपके ध्यान के योग्य होने के लिए पर्याप्त महत्वपूर्ण है।

+0

मैं सिर्फ 'CGRect' संरचना को लगभग 10 गुना भरना चाहता हूं और पाया कि मुझे नहीं पता कि सर्वोत्तम तरीके से कैसे परिवर्तित किया जाए –

+1

प्रश्न यह है कि, क्या इसे भरें? यदि आप उन्हें शाब्दिक हार्ड-कोड किए गए मानों के साथ भर रहे हैं, तो आप बिना किसी रूपांतरण के '' NSMakeRect (1.0, 1.0, 1.0, 1.0) 'लिख सकते हैं। दूसरी तरफ, यदि आप एक प्लेस्ट से डेटा पढ़ रहे हैं, तो आपको किसी भी NSNumber ऑब्जेक्ट को प्राप्त करने जा रहे हैं, इसलिए बस इसकी '-floatValue' विधि को कॉल करें। '-intValue' से वापसी मूल्य कास्टिंग टाइप करें, लेकिन बिना किसी व्यर्थ अपर्याप्तता को पूरा करेगा। सबसे आसान तरीका लगभग हमेशा सबसे अच्छा है। –

+0

मैं इसे 'के लिए' चक्र में कर रहा हूं, मुझे int मान प्राप्त होता है और इसे 'CGRect' संरचना –

2

मुझे वास्तव में NSNumber ऑब्जेक्ट की आवश्यकता दिखाई नहीं देती है जब दो संख्यात्मक प्राइमेटिव के बीच एक प्रत्यक्ष टाइपकास्ट उपलब्ध होता है। NSNumber कक्षा पूरी तरह से टाइप रूपांतरण के लिए बिल्कुल नहीं थी।

5

चूंकि आप सुरक्षा के बारे में पूछते हैं, तो आपको सबसे पहले यह जांचने की आवश्यकता है कि int का मान float में फिट बैठता है या नहीं। अन्यथा आप चुपचाप डेटा खो रहे हैं। जब तक कि मूल्य बहुत छोटा न हो, यह फिट नहीं होगा। मैं double उपयोग भी कर जाएगा, ताकि आप इस बारे में चिंता करने की जरूरत नहीं है, तो बस काम करते हैं:

double d; 
d = i; 

ज्यादा short तरह प्रकार float की चर के लिए शायद ही कभी कोई उपयोग करते हैं, नहीं है ...

+0

-1 एक फ्लोट के लिए अधिकतम मान int के अधिकतम मूल्य से _much_ बड़ा है। एक फ्लोट के लिए अधिकतम को 3.40282347 x 10^38 के रूप में परिभाषित किया गया है जबकि एक int के लिए अधिकतम 2147483647 के रूप में परिभाषित किया गया है जो फ्लोट 1.58456316 × 10^2 9 गुना बड़ा – nick

+3

@nick के लिए अधिकतम मान बनाता है: सिर्फ इसलिए कि अधिकतम मान बड़ा होता है इसका मतलब यह नहीं है कि ''फ्लोट' में कोई भी 'int' फिट बैठता है। एक 'फ्लोट' (आईईईई एकल परिशुद्धता) में केवल मंटिसा के लिए 24 मूल्य बिट हैं। इसका मतलब है कि यदि एक पूर्णांक 2^24-1 से बड़ा है, तो यह केवल एक फ्लोट में फिट बैठता है यदि कम बिट्स शून्य हैं। यही है, '0x1fffffe' फिट बैठता है लेकिन '0x1ffffff' नहीं है। यदि आप मुझ पर विश्वास नहीं करते हैं, तो बाद वाले को एक फ्लोट और पीछे परिवर्तित करने का प्रयास करें और आप देखेंगे कि मान बदल गया है। (यदि आप जीसीसी के साथ x86 पर हैं, तो '-फ्लैट-स्टोर' का उपयोग करना सुनिश्चित करें या यह वास्तव में परिवर्तित नहीं हो सकता है।) –

+0

आप सही हैं, मैं कभी नहीं जानता था और मैं क्षमा चाहता हूं, लेकिन यह थोड़ा अजीब लग रहा था मुझे। मैं -1 को हटाने की कोशिश कर रहा हूं, लेकिन यह मुझे बताता है कि वोट लॉक है :( – nick

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