2012-02-09 10 views
6

में बूलियन से बाइट को परिवर्तित करना .NET में पर boolean कास्टिंग क्यों करता है, निम्नलिखित आउटपुट देता है?वीबीएनईटी

कोड SNIPPIT:

Dim x As Boolean = 1 
Dim y As Byte = x 'Implicit conversion here from Boolean to Byte 

System.Diagnostics.Debug.Print(_ 
    "x = " & x.ToString _ 
    & " y = " & y.ToString _ 
    & " (bool)(1) = " & CType(1, Boolean).ToString _ 
    & " (byte)((bool)1) = " & CType((CType(1, Boolean)), Byte).ToString) 

आउटपुट:

एक्स = सच
y = 255
(bool) (1) = true
(बाइट) ((bool) 1) = 255

True (डब्ल्यू जिसे आमतौर पर 1 के पूर्णांक प्रतिनिधित्व के रूप में जाना जाता है) byte पर डाला जाने पर 255 में परिवर्तित हो जाता है?

+0

मुझे यह उत्सुक लगता है कि वीबी.नेट आपको एक बूलियन को बाइट में भी डालने देता है। सी # में यह एक अवैध कलाकार है। – vcsjones

+0

यदि आप वीबीएनईटी में 'डायरेक्टकास्ट() 'करते हैं तो यह स्वचालित रूप से आपको बताएगा कि यह एक अवैध कलाकार है, लेकिन यदि आप' सीटीपी() '(जो मैंने दिखाया है) का उपयोग करते हैं, तो यह उपरोक्त के रूप में करेगा। मुझे यह जानने में दिलचस्पी है कि 'ट्रू' जिसे आम तौर पर '1' के नाम से जाना जाता है, हुड के तहत' 255' तक अनुवाद करता है। यहां पर अजीब कास्टिंग बहुत सारे चल रहे हैं। – afuzzyllama

+0

मुझे लगता है कि यह सिर्फ कंपाइलर का व्यवहार है। यह आईएल 'ldc.i4 एफएफ 00 00 00' उत्सर्जित करता है, हालांकि मैं कल्पना में कुछ भी नहीं देख सकता जो कहता है। बहुत ही सरल मामलों के लिए संकलक सिर्फ कास्ट को अनुकूलित कर रहा है। – vcsjones

उत्तर

11

VB.NET संकलक यह एक सीमित करने conve के रूप में संभालती है rsion। से 10.0 VB.NET युक्ति:

संकुचन रूपांतरण यानी कि हमेशा सफल होने के लिए साबित नहीं किया जा सकता है, रूपांतरण कि संभवतः जानकारी खोने के लिए जाना जाता है, और रूपांतरण प्रकार पर्याप्त योग्यता को सीमित करने अंकन करने के लिए अलग से डोमेन के बीच कर रहे हैं।

  • बूलियन से बाइट के लिए, SByte, UShort, लघु, UInteger, पूर्णांक, Ulong, लांग, दशमलव, एकल, या डबल: निम्नलिखित रूपांतरण संकुचन रूपांतरण के रूप में वर्गीकृत किया जाता है।
the docs से

:

जब दृश्य मूल बूलियन के लिए संख्यात्मक डेटा प्रकार मान बदल देता है, 0 झूठी हो जाता है और अन्य सभी मान सच हो जाते हैं। जब विजुअल बेसिक बुलीयन मानों को संख्यात्मक प्रकारों में परिवर्तित करता है, तो गलत 0 हो जाता है और सत्य बन जाता है -1।

बाइट के हस्ताक्षर नहीं किए गए हैं, इसलिए आपको Two's Compliment से 255 मिलते हैं।

4

.NET में True का एक बूलियन मान -1, जो बारी में 11111111 कारण Two's Complement

तो Dim x As Boolean = 1 बूलियन सही पर 1 धर्मान्तरित करने के लिए

और Dim y As Byte = x 11111111 करने के लिए यह सच है बदल देता है, जो बराबर होती है के रूप में संग्रहीत किया जाता है 255

(इसके बजाय यदि आपने लिखा Dim z As Integer = x, जेड = -1 होगा)

3

बेसिक I के सभी ऐतिहासिक संस्करणों ने देखा है कि पूर्णांक वाले बूलियन ऑपरेटर ने "ऑल-बिट्स-सेट", यानी -1, वास्तविक तुलना के मूल्य के रूप में उपयोग किया है। इस प्रकार, यदि कोई ऐसा मान चाहता था जो 9 था, यदि == बी, या शून्य नहीं है, तो कोई अभिव्यक्ति 9 AND (a=b) का उपयोग कर सकता है। जबकि ?: सी में मौजूद ऑपरेटर इस तरह के व्यवहार को अधिक स्पष्ट रूप से कोडित करने की अनुमति देता है, "सत्य" के लिए -1 का उपयोग एक अलग बुलीयन प्रकार के बिना किसी भाषा में नुकसान के मुकाबले अधिक व्यावहारिक फायदे हैं।

जबकि vb.net अपनी भाषा है, vb6 से काफी अलग है, वहां बहुत सारे कोड हैं जिन्हें vb6 से vb तक पोर्ट किया गया है।नेट, और इस तथ्य पर भरोसा कर सकते हैं कि तुलना ऑपरेटर सच्चे होने पर सभी बिट्स-सेट उत्पन्न करते हैं।

0

आप 0 को 1 और false को true कन्वर्ट करने के लिए चाहते हैं, का उपयोग करें:

Convert.ToByte(Boolean) 

लिंक प्रलेखन Convert.ToByte(boolean) करने के लिए।

अन्यथा आपको असली मान -1, 0xFF मिलता है।