2010-09-04 12 views

उत्तर

29

आश्चर्य की बात है कि, जब आप बाइट्स पर संचालन करते हैं तो कंप्यूटेशंस int मानों का उपयोग करके किया जाएगा, बाइट्स को पहले (int) पर डाला जाएगा। short एस के लिए यह भी सच है, और इसी प्रकार float एस double पर फ़्लोटिंग-पॉइंट अंकगणित करते समय अप-रूपांतरित हो जाते हैं।

दूसरा टुकड़ा के बराबर है:

byte someVar; 
someVar = (int) someVar - 3; 

क्योंकि यह आप परिणाम वापस (byte) लिए डाली काम स्वीकार करने के लिए संकलक पाने के लिए करना चाहिए।

someVar = (byte) (someVar - 3); 
+0

कोई व्यक्ति सत्यापित कर सकता है कि टाइप कास्टिंग कुछ स्तर- = 3 में आईएल स्तर पर होता है; उदाहरण? क्या यह एक ही आईएल कोड उत्पन्न करता है? – Dested

+2

मैंने अभी परावर्तक के साथ जांच की है। '- =' ऑपरेटर आईएल स्तर पर 'conv.u1' उत्पन्न करता है, यही कारण है कि पहला स्निपेट –

+5

@Dested काम कर रहा है सटीक नियम सी # भाषा विशिष्टता में दिए गए हैं। यह बताता है: _ "उपरोक्त दूसरा नियम 'x op = y' को कुछ संदर्भों में' x = (टी) (x op y)' के रूप में मूल्यांकन करने के लिए अनुमति देता है। नियम मौजूद है कि पूर्वनिर्धारित ऑपरेटरों को यौगिक ऑपरेटरों के रूप में उपयोग किया जा सकता है जब बाएं ऑपरेंड प्रकार 'sbyte', 'बाइट',' शॉर्ट', 'ushort', या' char' प्रकार का होता है। यहां तक ​​कि जब दोनों तर्क एक प्रकार के होते हैं, तो पूर्वनिर्धारित ऑपरेटर प्रकार 'int' जैसा कि §7.3.6.2 में वर्णित है। इस प्रकार, बिना किसी कलाकार के बाएं ऑपरेंड को परिणाम असाइन करना संभव नहीं होगा। "_ –

11

यहाँ CLI विनिर्देश (ECMA 335) यह बताता है कि जो ऑपरेंड ग्रुप ए सेशन बी, जहां ए और बी ऑपरेंड और "सेशन" कर रहे हैं की बाइनरी संख्यात्मक ऑपरेटरों पर मान्य हैं में एक टेबल की एक प्रति है

alt text

कुछ टिप्पणियां इस के साथ की आवश्यकता है::

  • "देशी पूर्णांक" में IntPtr है ऑपरेटर, Opcodes.Sub की तरह है कि आप अपने स्निपेट में उपयोग कर रहे हैं एक सी # कार्यक्रम
  • एफ एक चल बिन्दु प्रकार का प्रतिनिधित्व करता है, डबल या में तैर सी #
  • & एक सूचक मूल्य का प्रतिनिधित्व करता, बक्से छायांकित हैं क्योंकि वे असुरक्षित संचालन कर रहे हैं
  • हे एक वस्तु संदर्भ का प्रतिनिधित्व करता है
  • x एक ऐसा ऑपरेशन है जिसकी अनुमति नहीं है।

नोट पंक्ति और एफ के लिए स्तंभ, दोनों ऑपरेंड चल जाना चाहिए बिंदु, तुम नहीं सीधे, किसी पूर्णांक एक डबल करने के लिए जोड़ सकते हैं कहते हैं,। सी # कंपाइलर स्वचालित रूप से इंट ऑपरेंड को दोबारा परिवर्तित करके उस सीमा से संबंधित है ताकि ऑपरेटर मान्य हो।

आपके प्रश्न के लिए प्रासंगिक: यह भी ध्यान दें कि बाइट, sbyte, char, short और ushort प्रकार मौजूद नहीं हैं। वही दृष्टिकोण, कंपाइलर ऑपरेटरों को सबसे छोटे प्रकार में परिवर्तित करता है जो मूल्य का प्रतिनिधित्व कर सकता है ताकि ऑपरेटर का उपयोग किया जा सके। जो int32 होगा। तालिका के अनुसार, ऑपरेशन का परिणाम int32 होगा।

अब यहां रगड़ है: नतीजा int32 है लेकिन इसे बाइट वैल्यू पर वापस सौंपने के लिए एक संकीर्ण रूपांतरण की आवश्यकता होती है। 32 बिट्स से 8 बिट्स तक। यह मुसीबत है क्योंकि यह महत्वपूर्ण बिट्स खो देता है। सी # कंपाइलर के लिए आपको यह स्पष्ट करने की आवश्यकता है। आप अनिवार्य रूप से स्वीकार करते हैं कि आप जानते हैं कि आप क्या कर रहे हैं और आप संभावित आश्चर्यजनक परिणाम से अवगत हैं।इस तरह:

byte v = 255; 
v = (byte)(v + 1); 

- = ऑपरेटर कि आवश्यक डाली लागू करने के लिए कोई प्रभावी तरीका है क्योंकि वहाँ एक समस्या है। यह भाषा वाक्यविन्यास में व्यक्त नहीं है। (बाइट) 3 का उपयोग करना समझ में नहीं आता है, ऑपरेटर को काम करने के लिए शाब्दिक int32 में परिवर्तित हो जाता है।

उन्होंने समस्या को पछाड़ दिया, संकलक स्वचालित रूप से आपकी मदद के बिना कलाकारों को उत्सर्जित करता है।

+0

यह बताता है कि मैं अलग-अलग प्रकार के बीच प्रतिबिंबित करने के लिए प्रतिबिंब का उपयोग करने में असमर्थ क्यों हूं। – fusi

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