VB.NET

2009-04-13 21 views
29

में पूर्णांक के लिए बूलियन कन्वर्ट निम्नलिखित कोड डालें:VB.NET

-1 
1 

ऐसा क्यों है:

Sub Main() 

    Dim i As Integer 
    Dim b As Boolean 

    i = 1 
    b = i 
    i = b 
    Console.WriteLine(i) 

    i = Convert.ToInt32(b) 
    Console.WriteLine(i) 

End Sub 

यह निम्न प्रिंट?

(बस एक मजाक :) आप 0 भी प्राप्त कर सकते हैं ...

Int32.TryParse("True", i) 
Console.WriteLine(i) 

उत्तर

43

आप जो देख रहे उसके सिर दिखा विरासत कोड का एक सा है।

इस मामले के केंद्र में VT_BOOL प्रकार है। विजुअल बेसिक 6.0 ने अपने बूलियन मानों के लिए VT_BOOL प्रकार (AKA VARIANT_BOOL) का उपयोग किया। एक VARIANT_BOOL के लिए सही मान VARIANT_TRUE के साथ दर्शाया गया है जिसमें पूर्णांक मान -1 है। .NET में रूपांतरण के दौरान यह निर्णय लिया गया था कि एक बूलियन मान को एक इंटीजर मान में बदलने के लिए विजुअल बेसिक रूपांतरण दिनचर्या का उपयोग करते समय, विजुअल बेसिक 6.0 सेमेन्टिक्स रिटर्न वैल्यू पर बनाए रखा जाएगा; यह -1 होगा।

पहला निहित रूपांतरण बी = i लाइन के साथ होता है। हुड के तहत यह पूर्णांक से बूलियन तक एक अंतर्निहित रूपांतरण करता है। कोई गैर-शून्य मान सत्य माना जाता है, इसलिए परिणामी मान सत्य है।

हालांकि, कोड की निम्न पंक्ति एक पूर्णांक प्रकार के लिए एक अंतर्निहित रूपांतरण कर रही है।

हुड इस दृश्य मूल रूपांतरण दिनचर्या ( CType या CInt) में से एक का उपयोग करता है एक पूर्णांक के लिए मूल्य कन्वर्ट करने के लिए के तहत

। जैसे कि विजुअल बेसिक अर्थशास्त्र खेल में हैं और मूल्य लौटाया गया है -1।

अगली दिलचस्प पंक्ति Convert.ToInt32() लाइन है। यह एक .NET रूपांतरण दिनचर्या का उपयोग कर रहा है जो विजुअल बेसिक अर्थशास्त्र का उपयोग नहीं करता है। इसके बजाए, यह एक वास्तविक बूलियन मान के लिए अंतर्निहित BCL प्रतिनिधित्व देता है जो 1.

+4

आप इस बारे में कुछ जोड़ना चाहते हैं कि क्यों VT_BOOL का उपयोग किया गया था, और इसका मूल्य क्यों है -1। वीबी 6 में केवल "और" और "या" ऑपरेटरों का 1 सेट था, जो दोनों तार्किक और बिटवाई ऑपरेशंस (अधिकांश भाषाओं में 2 सेट होते हैं)। यह "और" को "और" के रूप में कार्यान्वित करके काम करता है और शाब्दिक डिफ़ॉल्ट -1 है। –

+0

इस तरह "सत्य और एक्स" शून्य शून्य है कभी भी "x" शून्य नहीं है। –

+0

आप यहां अधिकतर असंबंधित प्रश्न के उत्तर में "क्यों" की भावना प्राप्त कर सकते हैं: https://stackoverflow.com/a/46331671/3043 –

25

कुछ भाषाओं में, बूलियन सच -1 बजाय 1. मैं अनुसंधान करने के लिए क्यों देखने के लिए होगा पर विचार के रूप में मुझे याद नहीं है।

वीबी 6 में, स्थिर True का मूल्य -1 है।

हालांकि, Convert.ToInt32(Boolean)documented वापस लौटने के रूप में "नंबर 1 यदि मान सही है, अन्यथा, 0." इस तरह, यह वही है चाहे आप किस फ्रेमवर्क भाषा का उपयोग कर रहे हों।

संपादित करें: प्रश्न boolean true -- positive 1 or negative 1

+0

कुछ भाषाओं में, का उपयोग '-1'' TRUE' के रूप में, क्योंकि यह है '0b11111111', इसलिए हर बिट शून्य के द्विआधारी प्रतिनिधित्व के विपरीत है, ऐसा है कि का उपयोग कर एक बिट पर ऑपरेशन एक दूसरे के परिणामस्वरूप नहीं होगा। – mbomb007

1

डिफ़ॉल्ट रूप से झूठी के लिए है ऐसा इसलिए है क्योंकि VB.NET में, बूलियन मान हैं -1 सच और 0 के लिए देखें। मुझे यकीन है कि क्यों यह, 1 के रूप में प्रिंट दूसरी बार हालांकि नहीं कर रहा हूँ ...

7

MSDN दृश्य मूल प्रलेखन से:

Type Conversions

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

और Convert.ToInt32(value) के लिए:

संख्या 1 यदि मान सच है retuns; अन्यथा, 0.

अपने कोड के लिए

तो:

i = 1 
b = i // b becomes true 
i = b // true = -1 
Console.WriteLine(i) // i is -1 

i = Convert.ToInt32(b) // Convert.ToInt32(true) = 1 
Console.WriteLine(i) // i is 1 
+0

उन दस्तावेज़ उद्धरणों के लिए एक लिंक जोड़ें और मैं ऊपर उठ जाऊंगा। –

10

क्यों सच के लिए -1 का उपयोग किया जाता है, मुझे विश्वास है कि ऐसा इसलिए है क्योंकि यह सचमुच (0 नहीं) है।

शून्य से प्रारंभ करें, सभी बिट्स फ्लिप करें और फिर इसे दो पूरक के रूप में पढ़ें - नकारात्मक एक बाहर आता है।

इसलिए चूंकि कुछ भी गलत नहीं है, और गलत 0 है, (झूठा नहीं) -1 का प्रतिनिधित्व करता है।

यह सिर्फ संयोग है, हालांकि हो सकता है ....

+3

यही कारण है कि वीबी सच के लिए -1 का उपयोग करता है। :) –

+1

+1। यह ध्यान रखना दिलचस्प है कि यदि "सत्य" -1 है, तो उसी ऑपरेटर का उपयोग बूलियन तर्क और पूर्णांक बिट-मास्किंग के लिए किया जा सकता है। यह भी दिलचस्प है कि शॉर्ट सर्किट "और" और "या" के सवाल के सवाल से स्वतंत्र है कि क्या 'सत्य' ऑपरेटरों को एक ही मूल्य पर मजबूर होना चाहिए। – supercat

1

सभी संख्यात्मक डेटा प्रकार बूलियन के रूप में इस्तेमाल कर सकते हैं! नतीजा इस्तेमाल किए गए डेटा प्रकार पर निर्भर है।

उदाहरण:

Dim i As Byte ' Byte is non-signed! 
Dim b As Boolean = True 

i = b   ' Set first (lowest) bit of i (non-signed byte) 
' i is now binary 0000 0001 = 1! 


Dim i As SByte ' SByte is signed! 
Dim b As Boolean = True 

i = b   ' Set all bits of i (signed byte) 
' i is now FF (binary 1111 1111 = -1 ! 

पूर्णांक हस्ताक्षरित किया गया है, पूर्णांक के लिए यह सच है -> -1।

UInteger गैर हस्ताक्षरित किया गया है, uint के लिए यह सच है -> 1.

और इसी तरह ...

एक झूठी मूल्य पर हस्ताक्षर किए numerics में सबसे अधिक बिट को साफ करता है, और सबसे कम गैर-साइन्ड numerics में।

इसलिए सभी संख्यात्मक डेटा प्रकारों में गलत 0 है।

2

"ट्रू" एक संख्यात्मक डेटा प्रकार के 0 मान से एक अस्वीकृति है!

नहीं (0) गैर-साइन्ड प्रकार के लिए रिटर्न 1.

नहीं (0) पर हस्ताक्षर किए प्रकार के लिए रिटर्न -1।

मुझे आपका कोड पता नहीं है, शायद आपका कोड दूसरी बार आंतरिक डेटा रूपांतरण करता है।

1

यह एक कुशल जवाब है, लेकिन:

Dim b As Boolean 
    b = False 
    Dim i As Integer 
    i = IIf(b, 1, 0)