java - जावा में बाइट्स-128 से 127 की सीमा क्यों है?




byte (5)

मुझे समझ में नहीं आता कि बाइट का सबसे कम मूल्य क्यों ले सकता है -128 । मैं देख सकता हूं कि उच्चतम मूल्य 127 , क्योंकि यह 01111111 बाइनरी में है, लेकिन एक 8-बिट्स के साथ -128 प्रतिनिधित्व कैसे करता है, जिसमें से एक का उपयोग साइन के लिए किया जाता है? सकारात्मक 128 पहले से ही 8-बिट, यानी 10000000 , और फिर नकारात्मक संकेत का प्रतिनिधित्व करने के लिए आपको 9वीं बिट की आवश्यकता होगी।

क्या कोई मुझे यह समझाने में मदद कर सकता है।


जवाब दो पूरक है

संक्षेप में, जावा (और सबसे आधुनिक भाषाएं) हस्ताक्षरित-परिमाण प्रतिनिधित्व का उपयोग करके हस्ताक्षरित पूर्णांक का प्रतिनिधित्व नहीं करती हैं। दूसरे शब्दों में, एक 8-बिट पूर्णांक एक साइन बिट नहीं है जिसके बाद 7-बिट हस्ताक्षरित पूर्णांक होता है।

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

दो पूरक प्रणालियों की एक और दिलचस्प संपत्ति यह है कि पहला बिट प्रभावी रूप से एक संकेत संकेतक के रूप में कार्य करता है (यानी बिट 1 से शुरू होने वाली सभी संख्याएं ऋणात्मक हैं), लेकिन अगले सात बिट्स को स्वयं के लिए एक हस्ताक्षरित संख्या के रूप में व्याख्या नहीं किया जाना चाहिए जो साइन बिट लागू होता है।

दो का पूरक बहुत जटिल नहीं है, लेकिन दो पूरक के बारे में प्रारंभिक अच्छी पकड़ प्राप्त करना और यह कैसे और क्यों काम करता है शायद एसओ उत्तर के दायरे से बाहर है। विकिपीडिया लेख से शुरू करें, या अधिक संसाधनों के लिए शब्द को Google करें।

-128 के बारे में अपनी क्वेरी को संक्षिप्त रूप से संबोधित करने का प्रयास करने के लिए, दो की पूरक संख्या उत्पन्न करने के पीछे मौलिक विचार संख्या के हस्ताक्षरित रूप को लेना, सभी बिट्स को उलटा करना और एक जोड़ना है। तो हस्ताक्षरित 128 10000000 है। उलटा, यह 01111111 है, और एक जोड़कर फिर से 10000000 मिल जाता है। तो दो की पूरक प्रणाली में, 10000000 अनजाने में -128 है और +128 नहीं है। +128 से अधिक या उसके बराबर संख्याओं को केवल दो बिट्स पूरक प्रणाली का उपयोग करके 8 बिट्स में प्रदर्शित नहीं किया जा सकता है क्योंकि वे नकारात्मक संख्याओं के रूपों से संदिग्ध होंगे।


जावा में सभी चर जैसे बाइट शॉर्ट इंट लम्बा फ्लोट डबल को हस्ताक्षर के रूप में लिखा जाता है। इसलिए बहुत आसान है कि हेड बिट हमेशा निर्दिष्ट करता है कि क्या (ऋणात्मक या सकारात्मक) है, लेकिन क्योंकि संख्याएं 2 आधे से विभाजित होती हैं, नकारात्मक के रूप में स्थानांतरित होती है, 0 डिफ़ॉल्ट रूप से सकारात्मक होती है। तो ऐसा लगता है:

यह सकारात्मक है
+ | 0,001,001
1 | 0,001,001
यह नकारात्मक है
- | 0001001
0 | 0,001,001
एक बाइट कम नकारात्मक के रूप में है
-000000011111111
0000000011111111


दो के पूरक में शामिल होने के बिना: 2 ^ 8 (चूंकि एक बाइट 8 अंक है और इसमें 2 में से 1 मान हो सकते हैं) = 256, इसलिए बाइट का प्रतिनिधित्व करने वाले सबसे व्यक्तिगत मान 256 हैं। इसलिए, संख्याओं का प्रतिनिधित्व -128 से -1 है हमारी सीमा आधे। मेरा मानना ​​है कि यहां सवाल यह है कि 128 के बजाय अधिकतम सकारात्मक मूल्य 127 क्यों है। ऐसा इसलिए है क्योंकि हमें संख्या 0 का प्रतिनिधित्व करना है, इसलिए विशेष रूप से 0-127 हमारी सीमा की अन्य 128 संभावनाएं हैं।

अगर हम केवल सकारात्मक मूल्यों की अनुमति दे रहे थे, जैसे एक हस्ताक्षरित बाइट जहां नकारात्मक संख्या संभव नहीं है, तो सीमा 0-255 होगी, क्योंकि ये 256 अलग-अलग मान हैं (0 सहित)।


निम्नानुसार दो पूरक काम करता है;

एक बाइट में 8 बिट होते हैं।

00000000 मतलब 0 है

11111111 का मतलब 255 है

हालांकि, अगर संख्याएं इस तरह प्रस्तुत की गईं, तो हम संख्या को सकारात्मक या नकारात्मक के बीच अंतर नहीं कर सके। इस कारण से, बाईं तरफ बिट हमें यह जानकारी देता है। यदि बाईं तरफ बिट 0 , तो आप zero के शीर्ष पर अन्य बिट्स का मान जोड़ना शुरू कर सकते हैं। यदि बिट 1 , तो आपको -128 के शीर्ष पर जोड़ना शुरू करना चाहिए। क्योंकि बाईं तरफ बिट सात की शक्ति के लिए दो है।

उदाहरण;

इन उदाहरणों में, बाएं तरफ थोड़ा सा 1 है, इसका मतलब है कि हम -128 के शीर्ष पर अन्य बिट्स के मान जोड़ रहे हैं।

10000000 = -128 (-128 + 0)

10000001 = -127 (-128 + 1)

10000011 = -125 (-128 + 3)

10000111 = -121 (-128 + 7)

वही बाइट्स लेकिन इस बार, बाईं ओर थोड़ा 0 । इसका मतलब है, हम 0 के शीर्ष पर जोड़ना शुरू कर रहे हैं।

00000000 = 0 (0 + 0)

00000001 = 1 (0 + 1)

00000011 = 3 (0 + 3)

00000111 = 7 (0 + 7)

अगर हम अभी तक ठीक हैं, तो आपके प्रश्न का उत्तर, इस नियम के साथ 8 बिट्स के साथ सबसे छोटा संभव संख्या है;

10000000 = -128

सबसे बड़ी संख्या संभव है

011111111 = 127

यही कारण है कि, सीमा -128 और 127 के बीच है।


मूल संख्यात्मक प्रकार 2 ^ एन संख्याओं का प्रतिनिधित्व कर सकते हैं। एक मामला एन = 2 देखें। आप चार मामलों का प्रतिनिधित्व कर सकते हैं, उन्हें एक, बी, सी, डी कहते हैं। फिर आप या तो a=-2, b=-1, c=0, d=1 (यह स्वीकार्य तरीका है) या a=-1, b=0, c=1, d=2 (संभव है, लेकिन उपयोग नहीं किया)। इसलिए, यदि आपके पास केवल एक शून्य है और 2 ^ एन राज्यों को अपना abs(min) != max n बढ़ाना सीमाओं को ले जाता है, लेकिन abs(min) != max अभी भी है।





byte