2009-05-29 5 views
15

मैं VS2008 .net 3.5 WinForms का उपयोग कर में निम्न कोड के लिए है:सी # में बाइट घटाव के लिए एक कास्ट क्यों आवश्यक है?

byte percent = 70; 
byte zero = 0; 

Bitmap copy = (Bitmap)image1.Clone(); 
... 

Color oColor = copy.GetPixel(x, y); 
byte oR = (byte)(oColor.R - percent < zero ? zero : oColor.R - percent); 

जब मैं छोड़ "(byte)" कोड की अंतिम पंक्ति बंद है, मैं यह कह रही है एक संकलक त्रुटि मिलती है "परोक्ष प्रकार कनवर्ट नहीं कर सकता 'int' से 'byte'। " अगर सब कुछ byte और byte एक पूर्णांक प्रकार है ... तो मुझे कास्ट करने की आवश्यकता क्यों है?

+6

एरिक Lippert कहते हैं, संख्या "" मैं के रूप में बाइट्स की नहीं लगता कि "; मैं बिट्स कि संख्या, या वर्ण, या रंग या जो कुछ भी रूप में _interpreted_ किया जा सकता है के पैटर्न के रूप में उनमें से लगता है कि तुम होने के लिए जा रहे हैं। उन पर गणित करना और उन्हें संख्याओं के रूप में व्यवहार करना, फिर परिणाम को डेटा प्रकार में स्थानांतरित करना समझ में आता है जिसे अधिक संख्या में सामान्य रूप से व्याख्या किया जाता है। " Http://stackoverflow.com/questions/941584/byte-byte-int-why-c देखें। – Brian

+5

तुम लोग यदि कोई डुप्लीकेट के रूप में इस के रूप में चिह्नित है एहसास किया है, भले ही यह कहा गया था * पहले * लिंक "पहले से ही एक जवाब यहाँ है"? –

+0

नरक, अब यह भी "पहले पूछा गया" कहता है, भले ही अन्य प्रश्न तीन साल बाद पूछा गया था। –

उत्तर

15

क्योंकि घटाव एक पूर्णांक तक बढ़ रहा है। जैसा कि मुझे याद है, बाइट सी # में एक हस्ताक्षरित प्रकार है, इसलिए घटाव आपको बाइट्स के डोमेन से बाहर ले जा सकता है।

+1

घटाव हर संख्या प्रकार के डोमेन से बाहर ले जा सकते हैं। यह वास्तव में समझा नहीं जाता है कि बाइट-विशिष्ट घटाव ऑपरेटर क्यों नहीं है। –

+0

ठीक है, तो, जवाब है "क्योंकि सी # के डेवलपर्स ने फैसला किया कि वे एक नहीं चाहते थे।" –

2

ऐसा इसलिए है क्योंकि byte घटाव int देता है। असल में bytes पर कोई बाइनरी अंकगणितीय परिचालन int लौटाएगा, इसलिए कलाकारों की आवश्यकता है।

+0

मुझे लगता है कि घटाव, वास्तव में .... –

+0

उफ़ - धन्यवाद चार्ली, मैं इसे ठीक कर दिया। –

+0

क्या डाउनवोट का कोई कारण है? –

9

Arithmetic on bytes डिफ़ॉल्ट रूप से एक int मूल्य में परिणाम।

+0

लिंक मर चुका है ... –

4

चूंकि बाइट्स पर अंकगणित डिफ़ॉल्ट रूप से पूर्णांक को लौटाता है, इसलिए दो संभावित असाइनमेंटों के कारण नरक प्रकार शून्य (बाइट) को int (oColor.r-प्रतिशत की) को बढ़ावा दिया जाता है। इस प्रकार ऑपरेशन का प्रकार एक int है। कंपाइलर, बिना किसी कलाकार के, आपको एक संक्षिप्त प्रकार के लिए एक विस्तृत प्रकार असाइन करने की अनुमति देगा, क्योंकि यह एक हानिकारक ऑपरेशन है। इसलिए आपको त्रुटि मिलती है, जब तक कि आप स्पष्ट रूप से कहते हैं, "मुझे पता है कि मैं कुछ डेटा खो रहा हूं, यह ठीक है" कास्ट के साथ।

10

क्योंकि एक बाइट घटाव का परिणाम एक बाइट में फिट नहीं करता है यही कारण है कि:

byte - byte = (0..255) - (0..255) = -255..255 
+1

क्या एक अच्छा ग्राफिक स्पष्टीकरण !!! –

+17

फ्लोट या दशमलव के अलावा कोई भी पूर्णांक प्रकार नहीं है। int भी सीमित सीमा का है, इसलिए (min_int - max_int) फिट नहीं होगा, लेकिन यह एक int देता है। –

+2

@ एडम: 1) फ्लोट्स और डेसिमल पूर्णांक प्रकार नहीं हैं। 2) इनके लिए घटाव के परिणाम भी उपयुक्त नहीं हो सकते हैं, क्योंकि इनके पास एक सीमित (हालांकि बड़ी) सीमा भी है। – Brian

1

क्योंकि असाइनमेंट ऑपरेटर के दाएँ हाथ की ओर पर अंकगणितीय अभिव्यक्ति डिफ़ॉल्ट रूप से int करने के लिए मूल्यांकन करता है। आपके उदाहरण में percentint पर डिफ़ॉल्ट है। आप MSDN page पर इसके बारे में अधिक पढ़ सकते हैं।

2

क्योंकि sbyte, बाइट, ushort, और लघु पर अंकगणितीय संचालन स्वचालित रूप से int में परिवर्तित हो जाते हैं। इसके लिए सबसे व्यावहारिक कारण यह है कि इस तरह के संचालन ओवरफ्लो या अंडरफ्लो होने की संभावना है।

इस प्रकार, आपके टर्नरी ऑपरेशन में, अंतिम oColor.R-प्रतिशत, वास्तव में एक int में परिणाम होता है, बाइट नहीं। तो ऑपरेशन का रिटर्न प्रकार int है।

0

एफडब्ल्यूआईडब्ल्यू, जावा भी int को बाइट्स को बढ़ावा देता है।

1

इस सी # कोड को चलाने का प्रयास करें: ऑब्जेक्ट ओ = (बाइट) (1); ओ = (int) ओ; आप क्या उम्मीद करते हैं? अब कोशिश :)

मुझे लगता है कि यह सही है:

एरिक Lippert कहते हैं, संख्या "" मैं के रूप में बाइट्स की नहीं लगता कि "; मैं बिट्स कि हो सकता है के पैटर्न के रूप में उन्हें के बारे में सोच संख्याओं, या पात्रों, या रंगों या जो भी हो, के रूप में व्याख्या की गई है। यदि आप उन पर गणित करने जा रहे हैं और उन्हें संख्याओं के रूप में व्यवहार कर रहे हैं, तो परिणाम को उस डेटा प्रकार में स्थानांतरित करने के लिए समझदारी होती है जिसे अधिक संख्या में सामान्य रूप से व्याख्या किया जाता है। "

शायद बाइट int से char के करीब है।

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