2010-09-01 17 views
56

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

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

+19

[दो के पूरक] (http: //en.wikipedia.org/wiki/Two's_complement) –

+1

यह अन्य पूर्णांक प्रकारों 'लघु', 'int' और' long' के समान है। – starblue

+6

एक बेहतर सवाल यह है कि क्यों जावा बाइट प्रकार 0..255' की सीमा नहीं है? असल में कई लोग इस सवाल से पूछते हैं, ज्यादातर भाषाओं में 'बाइट' प्रकार हस्ताक्षरित है, लेकिन जावा 'बाइट' में भी हस्ताक्षर किए गए हैं, और मैं (और कई अन्य) मानते हैं कि यह एक खराब डिजाइन था जो जावा में एक दिन से बना रहा। जब आप जेएनआई काम कर रहे हों तो समस्याएं हैं, और जब आप कुछ 'बाइट' नाम देते हैं तो मुझे विश्वास करें 0..255! –

उत्तर

63

उत्तर two's complement है।

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

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

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

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

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

+0

साफ! चलो देखते हैं कि मुझे यह सही मिला है या नहीं: यह अभी भी सच है कि 8-बिट संख्याएं जो 0 (00000000 के अलावा) से शुरू होती हैं सकारात्मक हैं, और 1 से नकारात्मक हैं? इसके अलावा, दो के पूरक के बारे में केवल एकमात्र वास्तव में मुश्किल बात यह है कि बाइट्स के बिट प्रतिनिधित्व में गणित वर्ग में समान मूल्य नहीं होता है, यानी 10000000 सामान्यतः +128 होता है, लेकिन बाइट के रूप में यह -128 होता है। Amirite? –

+0

आप सही हैं। पहला बिट 1 है और केवल तभी यदि संख्या ऋणात्मक है। यदि पहली बिट 0 है, तो संख्या या तो सकारात्मक या शून्य है। –

+0

@ टाइलर: मुझे यकीन है कि आप इस पोस्ट के तहत भी मेरे प्रश्न का उत्तर दे सकते हैं: http://stackoverflow.com/questions/16775169/java-binary-literals-value-128-for-byte मुझे आशा है कि यह है बहुत सीधे नहीं है लेकिन मैं वास्तव में आश्चर्यचकित हूं और कुछ महीनों के बाद स्पोरैडिकली खोज कर रहा हूं, मुझे अभी भी कोई सुराग नहीं है: ~ – JBA

8

जैसा जेम्स ने अपनी टिप्पणी में बताया, ऐसा इसलिए है क्योंकि इस तरह के दो पूरक काम करते हैं।

यदि हम इसे अन्य शर्तों में डालते हैं, तो आप 2^8 = 256 प्रकार के मानों का प्रतिनिधित्व कर सकते हैं। जो इस मामले में 128 नकारात्मक संख्याओं, 127 सकारात्मक संख्याओं और शून्य के रूप में उपयोग किया जाता है। यदि हमने मूल्य का प्रतिनिधित्व करने के लिए 7 बिट्स का उपयोग किया है, तो एक संकेत के लिए +1 बिट, हम एक कम मूल्य का प्रतिनिधित्व कर सकते हैं और इसमें दो शून्य भी होंगे (जो कि दो मूल्यों की तुलना में बहुत दुर्भाग्यपूर्ण होगा क्योंकि इसके कारण अधिक जटिल होगा)।

1

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

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

3

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

1

बाइट 8 बिट से मिलकर बनता है ---> 1 बिट चिह्न (सकारात्मक या नकारात्मक) 7 बिट मूल्य

इसलिए रेंज -2^7 नकारात्मक (-128) 2^7 -1 सकारात्मक करने के लिए (127)

0

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

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

6

यहां उत्तरों के अलावा, मैं समझा सकता हूं कि कैसे दो पूरक काम करते हैं।

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

11111111 का मतलब है 255

हालांकि, अगर हम ऐसे ही कहते हैं, हम है कि क्या संख्या सकारात्मक है या नकारात्मक बीच अंतर नहीं कर सकते हैं। इस कारण से, बाईं तरफ बिट हमें यह जानकारी देता है। यदि बाईं तरफ बिट 0 है, तो आप शून्य के शीर्ष पर अन्य बिट्स का मान जोड़ना शुरू कर सकते हैं। यदि बिट 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 के बीच

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