2016-06-16 10 views
11

मैं कुछ डेटा प्रकारों और रूपांतरण के बीच अंतर को समझने की कोशिश कर रहा हूं।लंबे समय तक कास्टिंग के बीच क्या अंतर है। मैक्सवेल्यू int और कास्टिंग फ्लोट करने के लिए। मैक्स वैल्यू int?

public static void ExplicitTypeConversion2() 
    { 
     long longValue=long.MaxValue; 
     float floatValue = float.MaxValue; 
     int integerValue = (int) longValue; 
     int integerValue2 = (int)floatValue; 
     Console.WriteLine(integerValue); 
     Console.WriteLine(integerValue2);    
    } 

जब मैं उस कोड ब्लॉक चलाने के लिए, यह आउटपुट:

-1 
-2147483648 

मुझे पता है कि अगर मूल्य आप एक पूर्णांक को असाइन करना चाहते से बड़े है कि पूर्णांक रख सकते है, यह कम से कम मान देता है पूर्णांक (-2147483648)।

जहाँ तक मुझे पता है, long.MaxValue एक पूर्णांक के अधिकतम मूल्य से काफी बड़ा है, लेकिन अगर मैंने long.MaxValue से int पर कास्ट किया है, तो यह -1 देता है।

इन दोनों कास्टिंग में क्या अंतर है? मुझे लगता है कि पहला व्यक्ति भी -1 के बजाय -2147483648 लौटने का अनुमान लगाता है।

+1

मैं दौर अन्य तरीके से सोच रहा हूँ .... 'int i = (int) long.MaxValue'' मैं 'घ' 0xFFFFFFFF' से भर जाता है जो '-1' है, इसलिए यह मुझे स्पष्ट है। मुझे आश्चर्य है कि क्यों 'int i = (int) float.MaxValue' int.MinValue' में समाप्त होता है जो '0x80000000' है। –

उत्तर

2

मुझे स्पष्ट करने दें:

long longValue=long.MaxValue; 
float floatValue = float.MaxValue; 
int integerValue = (int) longValue; 
int integerValue2 = (int)floatValue; 

लंबे का अधिकतम मान 9.223.372.036.854.775.807 या 0x7FFFFFFFFFFFFFFF, इस प्रकार 2 के पूरक 0xFFFFFFFF में यह कम करने ऋण चिह्न बिट, दशमलव में -1 के रूप में प्रतिनिधित्व के साथ 0x00000001 वापस आ जाएगी के बाद है।

दूसरी तरफ, फ्लोट का अधिकतम मूल्य 3.40282347 ई +38 है, इस प्रकार इसे 3E + 38 के मान को गोल करने के लिए कास्टिंग किया जाता है और इसे कम करने के बाद 2 के पूरक का उपयोग करके हमें 0x80000000 का हेक्स मान कम से कम साइन बिट मिलता है , दशमलव में -2147483648 है।

यह सब मामला हस्ताक्षरित पूर्णांक पर लागू होता है, परिणाम हस्ताक्षरित लोगों पर अलग होगा।

संदर्भ:

https://msdn.microsoft.com/en-us/library/system.int64.maxvalue(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/system.single.maxvalue(v=vs.110).aspx

+0

आप फ्लोट से int में रूपांतरण के बारे में तर्क गलत हैं। आपका कथन "3.40282347 ई + 38, इस प्रकार इसे 3E + 38 के मान को गोलाकार करने के लिए कास्टिंग" केवल पेपर और पेन पर सही है, न कि कंप्यूटर – AhmadWabbi

+0

यह सभी आंतरिक प्रतिनिधित्व के लिए है ... 64 बिट लंबा ट्रंकिंग। हेक्साडेसिमल में 32 बिट int के लिए मैक्सवल्यू ** 0xFFFFFFFF ** है जो -1 के पूरक पर हस्ताक्षरित पूर्णांक प्रतिनिधित्व में -1 है। फ्लोट.मैक्सवल्यू बिटवाई का प्रतिनिधित्व करता है क्योंकि ** 0x7FFFFFFF ** बदले में बिट की दिशा में इंटीजर.मैक्सवेल्यू के बराबर है जो दो पूरक पूरक पर है। –

+0

@ JoãoRebelo फ़्लोट जिसमें थोड़ा पैटर्न 0x7FFFFFFF है, एक NaN है, और आंतरिक प्रतिनिधित्व वास्तव में एक फ्लोट-> int cast – harold

6

long.MaxValue का द्विआधारी मूल्य 0111...111111 (शून्य के बाद शून्य वाला) है। जब आप int पर जाते हैं, तो आप निम्नतम 32 बिट्स 111...11111 रखते हैं। यह -1 दशमलव में है, intsigned है और दो का पूरक लागू होता है।

+0

दशमलव में यह "42 9 4 9 672 9 5" होना चाहिए, लेकिन क्योंकि इंट 32 का अधिकतम मूल्य 2147483647 है जब यह नम्बर पहुंच जाता है तो यह 2147483648 (इसका न्यूनतम मूल्य) से गिनती शुरू होता है और फिर वास्तव में -1 तक पहुंच जाता है। –

+0

@ पॉलवेइलैंड नंबर यदि 'हस्ताक्षरित' है, तो मूल्य '42 9 4 9 672 9 5 होगा। लेकिन जैसा कि 'int'' हस्ताक्षरित है, 32 के अनुक्रम दो के पूरक में '-1' के बराबर होते हैं। सी # कास्टिंग में – AhmadWabbi

15

यदि मान आप एक पूर्णांक के लिए प्रदान करना चाहते हैं, कि पूर्णांक से भी बड़ा रख सकते हैं, एक नियम नहीं है यही कारण है कि पूर्णांक

की न्यूनतम मान देता है। (यानी डिफ़ॉल्ट) संबंधित नियमों एक unchecked संदर्भ में

पूर्णांक प्रकार के लिए कर रहे हैं:

तो स्रोत प्रकार गंतव्य प्रकार से बड़ा है, तो स्रोत मान द्वारा त्यागकर अपने "अतिरिक्त छोटा किया गया है "सबसे महत्वपूर्ण बिट्स। इसके परिणामस्वरूप गंतव्य प्रकार के मान के रूप में माना जाता है।

एक unchecked संदर्भ में float-> पूर्णांक के लिए:

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

0x7fffffffffffffff के 32 अग्रणी बिट्स को बंद करना 0xffffffff उर्फ ​​-1 देता है।

तुम कभी वादा किया गया आप रेंज float-> पूर्णांक कलाकारों से बाहर है कि के लिए int.MinValue मिल जाएगा, लेकिन तुम वैसे भी कर इसे लागू करने के लिए आसान है, क्योंकि: 64 के रूपांतरण अनुदेश cvtss2si और इसी रेंज परिणामों से बाहर के लिए 0x80000000 बनाता fistp (पुराने 32 बिट जेआईटी द्वारा उपयोग किए गए x87 रूपांतरण निर्देश) "पूर्णांक अनिश्चित मूल्य" स्टोर करता है जो 0x80000000 है।

+0

हेक्साडेसिमल प्रारूप के आधार पर काम करता है? दृश्यों के पीछे 0x7fffffffffffffff या बाइनरी? मेरा मतलब है कि उदाहरण के लिए एक प्रकार से दूसरे में परिवर्तित करना, अगर मैं बिट्स को अन्य प्रकार की बिट्स की जांच करने के लिए बाइनरी में परिवर्तित करता हूं, तो यह तय करें कि मैं डेटा रख सकता हूं या हानि डेटा – Tuncaf

+0

@ टनकफ दृश्यों के पीछे कोई प्रारूप नहीं है। हेक्साडेसिमल और बाइनरी क्या हो रहा है यह देखने के लिए केवल दो समान तरीके हैं (लेकिन हेक्स छोटा है, यही कारण है कि मैंने इसे चुना है)। – harold

+0

धन्यवाद @horald – Tuncaf

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