2013-01-22 18 views
10

मैं सोच रहा था -1 के बराबर है क्यों यह सच है -1 के बराबर है और न 1. अगर मैं सही ढंग से याद (वापस दिनों में) सी में, "सही" 1.क्यों यह सच है

Dim t, f As Integer 

    t = True 
    f = False 

    Console.WriteLine(t) ' -1 
    Console.WriteLine(f) ' 0 
    Console.ReadLine() 
के बराबर होगा
+4

सच है सभी बिट्स 1 पर सेट हैं। सभी हस्ताक्षरित पूर्णांक प्रकारों के लिए बराबर -1 होता है। –

+0

सी में, झूठी 0 के बराबर है। कोई अन्य मान सत्य है, जिसमें -1 शामिल हैं। ध्यान दें कि -1 बाइनरी 'नहीं' –

+0

का उपयोग करके '0 0 'बराबर नहीं है। – Guy

उत्तर

17

जब आप किसी भी गैर-शून्य संख्या को Boolean पर डालते हैं, तो यह True का मूल्यांकन करेगा। उदाहरण के लिए:

Dim value As Boolean = CBool(-1) ' True 
Dim value1 As Boolean = CBool(1) ' True 
Dim value2 As Boolean = CBool(0) ' False 

लेकिन, जैसा कि आप का कहना है, किसी भी समय आप डाली एक Boolean कि एक Integer को True पर सेट किया जाता है, यह -1 का मूल्यांकन करेंगे उदाहरण के लिए,:

Dim value As Integer = CInt(CBool(1)) ' -1 

इसका कारण यह है क्योंकि -1 हस्ताक्षरित-पूर्णांक मान है जहां इसकी सभी बिट्स 1 के बराबर होती हैं। Boolean को 16-बिट पूर्णांक के रूप में संग्रहीत किया जाता है, इसलिए सभी को ध्यान में रखते हुए सत्य और झूठे राज्यों के बीच टॉगल करना आसान होता है बिट्स के कम से कम महत्वपूर्ण न केवल 'बिट्स' के बजाय बिट्स का। दूसरे शब्दों में, True के लिए आदेश 1 होने के लिए, इसे इस तरह संग्रहीत किया जा करने के लिए होगा:

True = 0000000000000001 
False = 0000000000000000 

लेकिन यह सिर्फ इसे इस तरह स्टोर करने के लिए आसान है:

True = 1111111111111111 
False = 0000000000000000 

कारण यह आसान है क्योंकि, निम्न स्तर पर:

1111111111111111 = NOT(0000000000000000) 

जबकि:

0000000000000001 <> NOT(0000000000000000) 
0000000000000001 = NOT(1111111111111110) 

उदाहरण के लिए, यदि आप इस व्यवहार इस तरह Int16 वैरिएबल का उपयोग दोहराने कर सकते हैं:

Dim value As Int16 = 0 
Dim value2 As Int16 = Not value 
Console.WriteLine(value2) ' -1 

अगर आप अहस्ताक्षरित पूर्णांकों उपयोग कर रहे थे और अधिक स्पष्ट हो सकता है, तो क्योंकि, True का मूल्य के बजाय अधिकतम मूल्य है -1। उदाहरण के लिए:

Dim value As UInt16 = CType(True, UInt16) ' 65535 

तो, असली सवाल है, तो, क्यों दुनिया में VB.NET 16 बिट का उपयोग करता है एक बिट का मान संग्रहीत है। वास्तविक कारण गति है। हां, यह स्मृति की मात्रा 16 गुणा का उपयोग करता है, लेकिन एक प्रोसेसर 16-बिट बुलियन ऑपरेशन कर सकता है जो सिंगल-बिट बूलियन ऑपरेशंस कर सकता है।

कारण है कि -11111111111111111 बजाय 1000000000000001 के रूप में संग्रहीत किया जाता है, जैसा कि आप उम्मीद कर सकते हैं (पहली बिट साइन-सा जा रहा है, और बाकी सामान्य मूल्य जा रहा है), क्योंकि यह two's-पूरक के रूप में संग्रहीत किया जाता है है। दो अंकों के पूरक के रूप में नकारात्मक संख्याओं को संग्रहीत करना मतलब है कि प्रोसेसर के प्रदर्शन के लिए अंकगणितीय संचालन बहुत आसान है।

+1

के लिए बहुत कुछ शब्द "गैर-शून्य" देखेंगे! मैंने कभी नहीं सोचा कि 'नहीं (1) <> 0' एक मुद्दा होगा। –

2

अधिकांश भाषा है, 0 का एक संख्यात्मक मान झूठा है। बाकी सब कुछ सच माना जाता है। अगर मैं सही ढंग से remeber, -1 वास्तव में सभी बिट्स 1 सेट पर सेट है जबकि 0 सभी बिट्स 0 पर सेट है। मुझे लगता है कि यही कारण है।

+0

हाँ, आप "सत्य" – hometoast

0

यहाँ संभव डुप्लिकेट है: Casting a boolean to an integer returns -1 for true?

बूलियन निरंतर सच संख्यात्मक मान -1। ऐसा इसलिए है क्योंकि बूलियन डेटा प्रकार को 16-बिट हस्ताक्षरित पूर्णांक के रूप में संग्रहीत किया जाता है।इस निर्माण -1 में 16 बाइनरी 1 एस (बूलियन मान ट्रू) का मूल्यांकन होता है, और 0 0 0 के रूप में (बूलियन मान गलत)। 16 बिट हस्ताक्षरित पूर्णांक मान 0 पर एक ऑपरेशन निष्पादित करते समय यह स्पष्ट होता है जो पूर्णांक मान -1 वापस कर देगा, दूसरे शब्दों में सत्य = गलत नहीं है। यह अंतर्निहित कार्यक्षमता विशेष रूप से तब उपयोगी होती है जब पूर्णांक के व्यक्तिगत बिट्स जैसे एंड, या, ज़ोर और नॉट पर तार्किक संचालन करते हैं। [4] ट्रू की यह परिभाषा 1 9 70 के दशक के आरंभ में माइक्रोसॉफ्ट बेसिक कार्यान्वयन के बाद से बेसिक के साथ भी संगत है और उस समय सीपीयू निर्देशों की विशेषताओं से भी संबंधित है। जबकि किसी भी गैर शून्य मान True है

0

दृश्य मूल में, 0False है। इसके अलावा, MSDN प्रति:

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

0

मैं करने के लिए लगता है कि विधानसभा भाषा जहां एक सशर्त एक तुलना cmp आपरेशन करने के लिए अनुवाद किया है और शून्य झंडा (ZF) चेक किया गया है करने के लिए वापस चला जाता है। वास्तविक अभिव्यक्तियों के लिए ZF नहीं उठाया गया है, और झूठी अभिव्यक्तियों के लिए यह है। शुरुआती इंटेल प्रोसेसर इस तरह हैं, लेकिन मुझे याद नहीं है कि ज़िलोग Z80 और मोटोरोला 8-बिट प्रोसेसर का एक ही सम्मेलन था।

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