2009-07-05 10 views
9

संभव डुप्लिकेट:Int16 वैरिएबल से Int32 पैरामीटर के इंट 16 पैरामीटर के घटाव का परिणाम क्यों है?

void Method(short parameter) 
{ 
    short localVariable = 0; 
    var result = localVariable - parameter; 
} 

परिणाम एक Int32 के बजाय एक Int16 क्यों है:
byte + byte = int… why?

मैं इस तरह एक विधि है?

+0

बीटीडब्लू: जो सही अनिश्चित लेख है? "ए" या "ए"? –

+0

किसी भी प्रकार के दो मानों के जोड़ और घटाव एक परिणाम दे सकते हैं जो टाइप टी में फिट नहीं होता है। यह प्रश्न भी देखें: http://stackoverflow.com/questions/927391/why-is-a-cast-required -for-byte-subtraction-in-c – schnaader

+2

यह प्रभावी रूप से http://stackoverflow.com/questions/941584 जैसा ही है, केवल विभिन्न प्रकारों और एक अलग ऑपरेटर के साथ। –

उत्तर

11

यह केवल घटाव नहीं है, वहां बस कोई छोटा (या बाइट/एसबीईटी) अंकगणित नहीं होता है।

short a = 2, b = 3; 
short c = a + b; 

त्रुटि देगी कि यह int (ए + बी) को छोटा (सी) में परिवर्तित नहीं कर सकता है।

लगभग कभी भी कम उपयोग करने का एक और कारण नहीं है।

अतिरिक्त: किसी भी गणना में, शॉर्ट और स्बीट हमेशा int, ushort और बाइट को 'विस्तृत' किया जाएगा। यह व्यवहार वापस & आर सी पर जाता है (और प्रोबली उससे भी पुराना है)।

चार् के साथ व्यवहार करते समय, पुराने, दक्षता और अतिप्रवाह समस्याओं के लिए इसका पुराना कारण था। वह आखिरी कारण सी # के लिए इतना मजबूत नहीं है, जहां एक char 16 बिट्स है और int में पूरी तरह से परिवर्तनीय नहीं है। लेकिन यह बहुत भाग्यशाली है कि सी # संख्यात्मक अभिव्यक्ति सी और सी ++ के साथ बहुत उच्च डिग्री तक संगत रहती है।

+1

यह ध्यान दिया जाना चाहिए कि यह सी #/सीएलआई मानक का हिस्सा है। – user7116

1

मुझे लगता है कि इसके किया स्वचालित रूप से, अतिप्रवाह से बचने के लिए किया

आप कुछ इस तरह करते हैं का कहना है कि सुविधा देता है।

Short result = Short.MaxValue + Short.MaxValue; 

परिणाम स्पष्ट रूप से एक छोटे से फिट नहीं होगा।

एक बात जो मुझे समझ में नहीं आती है तो यह int32 के लिए क्यों नहीं करता है जो स्वचालित रूप से लंबे समय तक परिवर्तित हो जाएगा ???

+0

यह ओवरफ्लो को रोकने के लिए नहीं किया गया है, अक्षम कोड को हतोत्साहित करने के लिए। और यह सी/सी ++ –

7

इंट 32 से छोटे अभिन्न संख्या वाले सभी संचालन डिफ़ॉल्ट रूप से गणना से पहले 32 बिट्स तक बढ़ाए जाते हैं। परिणाम इंट 32 क्यों है इसे छोड़ने के लिए बस इसे छोड़ना है क्योंकि यह गणना के बाद है। यदि आप एमएसआईएल अंकगणितीय ऑपोड्स की जांच करते हैं, तो वे इंटी 32 और इंट 64 के साथ संचालित एकमात्र अभिन्न संख्यात्मक प्रकार हैं। यह "डिजाइन द्वारा" है।

यदि आप परिणाम को इंटेल 16 प्रारूप में वापस चाहते हैं, तो यदि आप कोड में कास्ट करते हैं तो यह अप्रासंगिक है, या संकलक (hypotetically) "हुड के नीचे" रूपांतरण को उत्सर्जित करता है।

इसके अलावा, उपरोक्त उदाहरण आसानी से डाली

short a = 2, b = 3; 

short c = (short) (a + b); 

दो नंबर 32 बिट का विस्तार होगा के साथ हल किया जा सकता है, घटाया मिलता है, फिर वापस 16 बिट तक छोटा कर दिया, जिसके कारण एमएस होने के लिए यह इरादा ।

कम (बाइट या) उपयोग करने का लाभ मुख्य रूप से (आदि स्ट्रीमिंग चित्रमय डेटा,) जहां डेटा की विशाल मात्रा में मामलों में भंडारण

पी.एस. है ओह, और लेख उन शब्दों के लिए "ए" है जिसका उच्चारण व्यंजन के साथ शुरू होता है, और उन शब्दों के लिए "ए" जिसका उच्चारण स्वरूप स्वर के साथ शुरू होता है। एक संख्या, एएन int।;)

+3

+1 से अच्छा जवाब मिला है। (और अनिश्चितकालीन लेख पर आपके उत्तर के लिए बोनस का हकदार है .-)) –

+1

उत्कृष्ट, केक 444। आपको अपना उत्तर इस संबंधित प्रश्न (http://stackoverflow.com/questions/941584/byte-byte-int-why) में जोड़ना चाहिए। मैं निश्चित रूप से इसे ऊपर उठाऊंगा। –

+1

सकारात्मक टिप्पणियों के लिए धन्यवाद, करेंगे। –

3

इस सूत्र के भीतर दी अन्य उत्तर है, साथ ही यहां दिए गए विचार विमर्श शिक्षाप्रद हैं:

(1) Why is a cast required for byte subtraction in C#?

(2) byte + byte = int… why?

(3) Why is a cast required for byte subtraction in C#?

लेकिन इसमें एक और झुर्रियां फेंकने के लिए, यह निर्भर करता है कि आप किस ऑपरेटरों का उपयोग करते हैं। वृद्धि (++) और कमी (-) ऑपरेटरों के साथ-साथ अतिरिक्त असाइनमेंट (+ =) और घटाव असाइनमेंट (- =) ऑपरेटरों को विभिन्न संख्यात्मक प्रकारों के लिए अधिभारित किया जाता है, और वे परिणाम को परिवर्तित करने का अतिरिक्त चरण निष्पादित करते हैं परिणाम लौटने पर ऑपरेंड के प्रकार पर वापस जाएं।

उदाहरण के लिए, कम उपयोग करते हुए:

short s = 0; 

s++;    // <-- Ok 
s += 1;    // <-- Ok 
s = s + 1;   // <-- Compile time error! 
s = s + s;   // <-- Compile time error! 

का उपयोग बाइट:

byte b = 0; 

b++;    // <-- Ok 
b += 1;    // <-- Ok 
b = b + 1;   // <-- Compile time error! 
b = b + b;   // <-- Compile time error! 

वे इसे इस तरह भी नहीं किया है, तो वेतन वृद्धि ऑपरेटर का उपयोग कॉल (++) असंभव हो जाएगा और अतिरिक्त असाइनमेंट ऑपरेटर को कॉल सबसे अच्छा होगा, उदाहरण के लिए:

short s 
s += (short)1; 

वैसे भी, बस एक और इस पूरी चर्चा करने के लिए pect ...

1

प्रभाव आप देख रहे हैं ...

short - short = int 

... इस Stackoverflow सवाल में बड़े पैमाने पर चर्चा की है: [link] byte + byte = int… why?

वहाँ की एक बहुत कुछ है अच्छी जानकारी और कुछ दिलचस्प चर्चा इस तरह क्यों है।

मेरा मानना ​​है कि यह खातिर प्रदर्शन की के लिए मूल रूप से है:

यहाँ जवाब "शीर्ष मतदान" है। (" क्यों होता है" के कारण यह है क्योंकि के लिए सी # द्वारा परिभाषित कोई ऑपरेटर नहीं है, बाइट, एसबीईटी, शॉर्ट या यूएसहॉर्ट के साथ अंकगणित, जैसा कि अन्य ने कहा है। यह उत्तर उन लोगों के बारे में है ऑपरेटर परिभाषित नहीं हैं।)

प्रोसेसर के पास पर मूल संचालन है 32 बिट्स के साथ अंकगणित करें। परिणाम को पर परिणाम से एक बाइट स्वचालित रूप से किया जा सकता है, लेकिन मामले में प्रदर्शन दंड का परिणाम होगा जहां आप वास्तव में व्यवहार नहीं चाहते हैं।

- जॉन Skeets

का आनंद लें,

रॉबर्ट सीकार्टैनो

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