हस्ताक्षरित संख्याओं के लिए साइन-एंड-परिमाण पर दो का पूरक क्यों पसंद करते हैं?


201

मैं सिर्फ उत्सुक हूँ अगर एक कारण है कि बाइनरी में -1 का प्रतिनिधित्व करने के लिए, दो के पूरक का उपयोग किया जाता है: बिट्स को फ़्लिप करना और 1 जोड़ना?

-1 का प्रतिनिधित्व 11111111 (दो का पूरक) के बजाय (मेरे लिए अधिक सहज) 10000001 द्वारा किया गया है जो कि नकारात्मक ध्वज के साथ पहले बिट के साथ बाइनरी 1 है।

अस्वीकरण: मैं अपनी नौकरी के लिए द्विआधारी अंकगणित पर भरोसा नहीं करता!


6
एफडब्ल्यूआईडब्ल्यू, साइन-बिट का उपयोग करने की आपकी "सहज" विधि का आमतौर पर उपयोग किया जाता है - उदाहरण के लिए, फ्लोटिंग पॉइंट संख्याओं का प्रतिनिधित्व करते समय अधिकांश कंप्यूटर साइन-बिट का उपयोग करते हैं।
आदिसक

2
@ एडिसक इसे हस्ताक्षरित परिमाण कहा जाता है
कोल जॉनसन

2
मैंने हमेशा साइन-एंड-परिमाण प्रतिनिधित्व को पूर्णांक के साथ जोड़ा है क्योंकि फ्लोटिंग पॉइंट संख्या में तीन घटक होते हैं: एक संकेत, एक घातांक और एक मंटिसा (अक्सर एक निहित '1')। लेकिन मुझे लगता है कि यह घातांक और मंटिसा के इलाज के लिए काफी आसान है जब तक कि उन्हें पता चलता है कि वे सख्ती से रैखिक नहीं हैं।
अदिसक

यहाँ एक लेख है जो बाइनरी-पॉइंट संख्याओं को बाइनरी में संग्रहीत किया जाता है, उन लोगों के लिए जो @ Adisak की टिप्पणियों के बारे में उत्सुक हैं।
जीडीपी 2

जवाबों:


333

यह इसलिए किया गया है ताकि नकारात्मक संख्याओं से निपटने के लिए किसी विशेष तर्क की आवश्यकता न पड़े। की जाँच करें विकिपीडिया पर लेख

मान लें कि आपके दो नंबर हैं, 2 और -1। संख्याओं का प्रतिनिधित्व करने के आपके "सहज" तरीके से, वे क्रमशः 0010और 1001, (मैं आकार के लिए 4 बिट्स चिपका रहा हूं)। में दो के पूरक भी तरह से, वे कर रहे हैं 0010और 1111। अब, मैं कहता हूं कि मैं उन्हें जोड़ना चाहता हूं।

दो का पूरक जोड़ बहुत सरल है। आप सामान्य रूप से संख्याएँ जोड़ते हैं और अंत में किसी भी कैरी बिट को छोड़ दिया जाता है। तो वे इस प्रकार हैं:

  0010
+ 1111
=10001
= 0001 (discard the carry)

0001 1 है, जो "2 + (- 1)" का अपेक्षित परिणाम है।

लेकिन आपकी "सहज" विधि में, जोड़ना अधिक जटिल है:

  0010
+ 1001
= 1011

जो -3 है, सही है? साधारण जोड़ इस मामले में काम नहीं करते हैं। आपको यह ध्यान देने की आवश्यकता है कि संख्याओं में से एक ऋणात्मक है और यदि यह मामला है तो एक अलग एल्गोरिथ्म का उपयोग करें।

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

इसके अतिरिक्त, "सहज" संग्रहण विधि में, दो शून्य हैं:

0000  "zero"
1000  "negative zero"

जो सहज रूप से एक ही संख्या में हैं, लेकिन संग्रहीत होने पर दो अलग-अलग मूल्य हैं। प्रत्येक एप्लिकेशन को यह सुनिश्चित करने के लिए अतिरिक्त कदम उठाने की आवश्यकता होगी कि गैर-शून्य मान भी नकारात्मक शून्य नहीं हैं।

इस तरह से भंडारण करने के साथ एक और बोनस है, और जब आपको रजिस्टर की चौड़ाई का विस्तार करने की आवश्यकता होती है, तो मूल्य को संग्रहीत किया जा रहा है। दो के पूरक के साथ, 8-बिट रजिस्टर में 4-बिट संख्या को संग्रहीत करना दोहराए जाने का मामला है। सबसे महत्वपूर्ण बिट:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

यह सिर्फ छोटे शब्द के साइन बिट को देखने और इसे दोहराने की बात है जब तक कि यह बड़े शब्द की चौड़ाई को नहीं बढ़ाता।

अपने तरीके से आपको मौजूदा बिट को खाली करने की आवश्यकता होगी, जो पैडिंग के अतिरिक्त एक अतिरिक्त ऑपरेशन है:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

आपको अभी भी उन दोनों मामलों में अतिरिक्त 4 बिट्स सेट करने की आवश्यकता है, लेकिन "सहज" मामले में आपको 5 बिट को भी साफ़ करने की आवश्यकता है। यह हर एप्लिकेशन में मौजूद सबसे मौलिक और सामान्य संचालन में से एक में एक छोटा अतिरिक्त कदम है।


13
मैं सहमत हूँ। 2 के पूरक काम करता है। लेकिन हम पहले स्थान पर कैसे पहुंचे? अगर मान लें कि मुझे इस अंकन में पहुंचने की आवश्यकता है, तो सोचा प्रक्रिया क्या होगी। मुझे लगता है कि 2 के पूरक पर पहुंचने का मतलब सिर्फ भाग्य से अधिक होना है, है न?
लेज़र

1
इसके अलावा, फ़्लोट्स के लिए कोई 2 का पूरक समकक्ष क्यों नहीं है?
लेज़र

6
@Lazer cs.cornell.edu/~tomf/notes/cps104/twoscomp.html जानने के लिए इस लेख की जाँच करेंhow we arrived at 2s compliment the first place.
अंकित

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

3
@ सूरज, मैं सुझाव देता हूं कि पूर्ण उत्तर के लिए दो पूरक पर विकिपीडिया लेख देखें: en.wikipedia.org/wiki/Two%27s_complement । संक्षिप्त उत्तर MSB है 1इंगित करता है -8, और शेष तीन 1रों संकेत मिलता है 4, 2और 1क्रमश: हां, तो -8+4+2+1 = -1
वेलबॉग

18

विकिपीडिया यह सब कहता है:

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

दूसरे शब्दों में, जोड़ना एक ही है, विथर या संख्या नकारात्मक है।


सर, अगर मैं चार = 12 लिखता हूं; और अहस्ताक्षरित चार बी = 12, अंतर्निहित बिट संरक्षक समान है, वास्तव में क्या होता है?
सूरज जैन

लिखने या पढ़ने पर कुछ नहीं बदलता। जोड़ या घटाव होने पर ही लागू होता है।
तलस्पिन_कीत

12

हालांकि यह प्रश्न पुराना है, मुझे मेरे 2 सेंट में डाल दें।

इससे पहले कि मैं यह समझाऊं, मूल बातों को वापस लाने की सुविधा देता है। 2 'पूरक 1 का पूरक है + 1। अब 1 का पूरक क्या है और इसके अतिरिक्त इसका क्या महत्व है।

किसी भी n- बिट संख्या का योग और उसका 1 का पूरक आपको उच्चतम संभव संख्या प्रदान करता है जिसे उन n- बिट्स द्वारा दर्शाया जा सकता है। उदाहरण:

 0010 (2 in 4 bit system)
+1101 (1's complement of 2)
___________________________
 1111  (the highest number that we can represent by 4 bits)

अब क्या होगा अगर हम परिणाम में 1 और जोड़ने की कोशिश करेंगे। यह एक अतिप्रवाह में परिणाम देगा।

परिणाम 1 00000 होगा (जैसा कि हम 4 बिट संख्या के साथ काम कर रहे हैं, (1 बाईं ओर एक अतिप्रवाह है)

इसलिए ,

Any n-bit number + its 1's complement = max n-bit number
Any n-bit number + its 1'complement + 1 = 0 ( as explained above, overflow will occur as we are adding 1 to max n-bit number)

फिर किसी ने 1 के पूरक + 1 को 2'आम लागू करने का निर्णय लिया। तो उपरोक्त कथन बनता है: कोई भी संख्या संख्या + उसके २ का पूरक = ० जिसका अर्थ है २ संख्या का पूरक = - (उस वर्ष का)

यह सब एक और सवाल पैदा करता है, हम सकारात्मक संख्या का प्रतिनिधित्व करने के लिए n बिट्स का केवल (n-1) का उपयोग क्यों कर सकते हैं और बाईं ओर सबसे nth बिट का प्रतिनिधित्व क्यों करता है (0 सबसे बाईं ओर का मतलब + वी संख्या, और 1 का मतलब है (नंबर)। उदाहरण के लिए, हम जावा में एक इंट के केवल पहले 31 बिट्स का उपयोग सकारात्मक संख्या का प्रतिनिधित्व करने के लिए करते हैं यदि 32 बिट 1 है, यह एक -ve संख्या है।

 1100 (lets assume 12 in 4 bit system)
+0100(2's complement of 12)
___________________________

1 0000 (परिणाम शून्य है, कैरी 1 अतिप्रवाह के साथ)

इस प्रकार (n + 2'complement of n) = 0 की प्रणाली, अभी भी काम करती है। यहाँ केवल अस्पष्टता 2 है 12 का पूरक 0100 है जो अस्पष्टता भी +8 का प्रतिनिधित्व करता है, 2s पूरक प्रणाली में -12 का प्रतिनिधित्व करने के अलावा।

यह समस्या हल हो जाएगी यदि सकारात्मक संख्याओं में हमेशा बाईं ओर 0 सबसे अधिक होता है। उस स्थिति में उनके 2 के पूरक के पास हमेशा उनके बाईं ओर 1 सबसे अधिक होता है, और हम अभ्यस्त बिट्स के समान सेट की अस्पष्टता का प्रतिनिधित्व करते हैं जो 2 के पूरक संख्या के साथ-साथ + ve संख्या का प्रतिनिधित्व करता है।


1
+ 1'ed। यह जानकारी थी, हालांकि अंत में मुझे यकीन नहीं है कि आप यह जानना चाहते थे कि यह एक सकारात्मक या नकारात्मक संख्या है या नहीं। इसमें कई मुद्दे हैं जैसे 0 में 2 प्रतिनिधित्व होंगे - 0000 (+) और 1000 (-) .. इसके अलावा और घटाव एक ही एल्गोरिदम का उपयोग करके नहीं किया जा सकता है। जब आप एक सामान्य 0100 कहते हैं तो यह +8 है और जब आप दो के पूरक 0100 कहते हैं तो यह -12 है
नागर

8

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


6

यह रकम और संख्याओं के अंतर को आसान बनाने के लिए है। एक ऋणात्मक संख्या का योग और 2 के पूरक में एक सकारात्मक कोडित समान है जो उन्हें सामान्य तरीके से जोड़ते हैं।


5

ऑपरेशन का सामान्य कार्यान्वयन "बिट्स को फ्लिप करना और 1 जोड़ना" है, लेकिन इसे परिभाषित करने का एक और तरीका है जो संभवतः राशन को साफ करता है। 2 का पूरक वह रूप है जो आपको मिलता है यदि आप सामान्य अहस्ताक्षरित प्रतिनिधित्व लेते हैं जहां प्रत्येक बिट 2 की अगली शक्ति को नियंत्रित करता है, और बस सबसे महत्वपूर्ण शब्द को नकारात्मक बनाता है।

एक 8 बिट मूल्य ले रहा है एक 7 एक 6 एक 5 एक 4 एक 3 एक 2 एक 1 एक 0

सामान्य अहस्ताक्षरित बाइनरी व्याख्या है:
2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 *
11111111 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255

दो की पूरक व्याख्या है:
-2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * एक 0
11111111 = -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1

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


4

दो के पूरक नकारात्मक और सकारात्मक संख्याओं को बिना किसी विशेष तर्क के एक साथ जोड़ने की अनुमति देता है।

आप 1 और जोड़ने की कोशिश की तो -1 अपने पद्धति का उपयोग करके
10000001 (-1)
00,000,001 (1)
आप प्राप्त
10,000,010 (-2)

इसके बजाय, दो के पूरक का उपयोग करके, हम जोड़ सकते हैं

11111111 (-1)
+00000001 (1) आपको मिलता है
00000000 (0) मिलता है

घटाव के लिए भी यही सच है।

इसके अलावा, यदि आप 4 को 6 (दो धनात्मक संख्याओं) से घटाकर 2 का पूरक 4 बना सकते हैं और दोनों को 6 + (-4) = 6 - 4 = 2 से जोड़ सकते हैं।

इसका मतलब यह है कि सभी सकारात्मक और नकारात्मक संख्याओं के घटाव और जोड़ सभी को सीपीयू में एक ही सर्किट द्वारा किया जा सकता है।


4

दूसरों के जवाब पर विस्तार करने के लिए:

दो के पूरक में

  • जोड़ना सादा धनात्मक पूर्णांक जोड़ने के समान तंत्र है।
  • घटाना भी नहीं बदलता है
  • गुणन भी!

डिवीजन को एक अलग तंत्र की आवश्यकता होती है।

ये सब सच है क्योंकि दो का पूरक सिर्फ सामान्य मॉड्यूलर अंकगणित है, जहां हम कुछ संख्याओं को मोड्यूलो को घटाकर नकारात्मक के रूप में देखना पसंद करते हैं।


ऐसा नहीं है कि केवल गैर-चौड़ीकरण गुणा ही है । लेकिन जैसा कि अधिकांश उच्च स्तरीय भाषाएं स्पष्ट कलाकारों के बिना गुणा गुणन का समर्थन नहीं करती हैं, परिणाम उन भाषाओं में समान होगा।
फुलेवव

@ LưuV LnhPhúc: बहुलीकरण गुणा आमतौर पर एक ही होगा, लेकिन हस्ताक्षरित और अहस्ताक्षरित परिणाम के लिए परिणाम केवल एक ही होने की गारंटी है अगर परिणाम एक हस्ताक्षरित इंट की सीमा में फिट होगा। कुछ संकलक जैसे gcc, कुछ दिया जैसे कि unsigned mul(unsigned short x, unsigned short y) { return x*y; }[16-bit छोटा; 32-बिट int] कभी-कभी कोड उत्पन्न करेगा जो कि उत्पाद 2147483647 से बड़ा होने पर खराबी पैदा करेगा।
सुपरकैट

2

इस प्रश्न के उत्तर को पढ़ते हुए मुझे यह टिप्पणी आई [संपादित]।

2 का पूरक 0100 (4) 1100 होगा। अब अगर मैं सामान्य रूप से कहूं तो 1100 12 है। इसलिए, जब मैं सामान्य 1100 कहता हूं तो यह 12 है, लेकिन जब मैं कहता हूं कि 2 का पूरक 1100 है तो यह -4 है? इसके अलावा, जावा में जब 1100 (अब के लिए 4 बिट्स मान लेता है) संग्रहीत किया जाता है तो यह कैसे निर्धारित किया जाता है अगर यह +12 या -4 है ?? - १६:५३ पर हगरावल २ जुलाई

मेरी राय में, इस टिप्पणी में पूछा गया प्रश्न काफी दिलचस्प है और इसलिए मैं सबसे पहले इसे फिर से लिखना और फिर एक उत्तर और एक उदाहरण प्रदान करना चाहूंगा।

प्रश्न - सिस्टम कैसे स्थापित कर सकता है कि एक या एक से अधिक आसन्न बाइट्स की व्याख्या कैसे की जानी है? विशेष रूप से, सिस्टम यह कैसे स्थापित कर सकता है कि बाइट्स का एक दिया गया क्रम एक सादा बाइनरी नंबर है या 2 का पूरक नंबर है?

उत्तर - सिस्टम स्थापित करता है कि प्रकार के माध्यम से बाइट्स के अनुक्रम की व्याख्या कैसे करें। प्रकार परिभाषित करते हैं

  • कितने बाइट्स पर विचार किया जाना है
  • कैसे उन बाइट्स की व्याख्या करनी होगी

उदाहरण - नीचे हम मानते हैं कि

  • char1 बाइट लंबी हैं
  • short2 बाइट्स लंबे हैं
  • int's और float4 बाइट्स लंबे हैं

कृपया ध्यान दें कि ये आकार मेरे सिस्टम के लिए विशिष्ट हैं। हालांकि बहुत आम है, वे सिस्टम से सिस्टम में भिन्न हो सकते हैं। यदि आप इस बात से उत्सुक हैं कि वे आपके सिस्टम में क्या हैं, तो साइज़ोफ़ ऑपरेटर का उपयोग करें ।

सबसे पहले हम 4 बाइट्स वाले एक सरणी को परिभाषित करते हैं और सभी 10111101को हेक्साडेसिमल संख्या के अनुरूप बाइनरी नंबर से प्रारंभ करते हैं BD

// BD(hexadecimal) = 10111101 (binary)
unsigned char   l_Just4Bytes[ 4 ]   =   { 0xBD, 0xBD, 0xBD, 0xBD };

फिर हम विभिन्न प्रकारों का उपयोग करके सरणी सामग्री को पढ़ते हैं।

unsigned char तथा signed char

// 10111101 as a PLAIN BINARY number equals 189
printf( "l_Just4Bytes as unsigned char  -> %hi\n", *( ( unsigned char* )l_Just4Bytes ) );

// 10111101 as a 2'S COMPLEMENT number equals -67
printf( "l_Just4Bytes as signed char    -> %i\n", *( ( signed char* )l_Just4Bytes ) );

unsigned short तथा short

// 1011110110111101 as a PLAIN BINARY number equals 48573
printf( "l_Just4Bytes as unsigned short -> %hu\n", *( ( unsigned short* )l_Just4Bytes ) );

// 1011110110111101 as a 2'S COMPLEMENT number equals -16963
printf( "l_Just4Bytes as short          -> %hi\n", *( ( short* )l_Just4Bytes ) );

unsigned int, intऔरfloat

// 10111101101111011011110110111101 as a PLAIN BINARY number equals 3183328701
printf( "l_Just4Bytes as unsigned int   -> %u\n", *( ( unsigned int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a 2'S COMPLEMENT number equals -1111638595
printf( "l_Just4Bytes as int            -> %i\n", *( ( int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a IEEE 754 SINGLE-PRECISION number equals -0.092647
printf( "l_Just4Bytes as float          -> %f\n", *( ( float* )l_Just4Bytes ) );

रैम में 4 बाइट्स ( l_Just4Bytes[ 0..3 ]) हमेशा एक जैसे ही रहते हैं। केवल एक चीज जो बदलती है वह यह है कि हम उनकी व्याख्या कैसे करते हैं।

दोबारा, हम सिस्टम को बताते हैं कि उन्हें किस प्रकार से व्याख्या करना है ।

उदाहरण के लिए, ऊपर हमने l_Just4Bytesसरणी की सामग्री की व्याख्या करने के लिए निम्न प्रकारों का उपयोग किया है

  • unsigned char: सादे बाइनरी में 1 बाइट
  • signed char: 2 के पूरक में 1 बाइट
  • unsigned short: सादे बाइनरी अंकन में 2 बाइट्स
  • short: 2 के पूरक में 2 बाइट्स
  • unsigned int: सादे बाइनरी अंकन में 4 बाइट्स
  • int: 2 के पूरक में 4 बाइट्स
  • float: IEEE 754 एकल-सटीक संकेतन में 4 बाइट्स

[EDIT] इस पोस्ट को user4581301 द्वारा टिप्पणी के बाद संपादित किया गया है। उन कुछ सहायक लाइनों को छोड़ने के लिए समय निकालने के लिए धन्यवाद!


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

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

मैं सिर्फ यह जानना चाहता हूं कि 2 का पूरक हमेशा अनुसरण करता है, मेरा मतलब है कि अगर मेरे पास है int x = -4, और फिर मैं printf("%d" , x)इसकी व्याख्या कैसे करता हूं ? इसके अलावा और और ... के बीच क्या अंतर है unsigned intऔर यह मुझे लंबे समय से परेशान कर रहा है। signed int%d%u
सूरज जैन

@ सूरज जैन intप्रकारों का उपयोग करते समय , signedसंशोधक डिफ़ॉल्ट है। इसका मतलब है कि intऔर signed intबिल्कुल उसी प्रकार के हैं। इस प्रकार दो परिभाषाएँ int i = -4;और signed int i = -4;एक ही अर्थ हैं।
mw215

@ सूरज जैन सिस्टम स्थापित करता है कि प्रकार के माध्यम से बाइट्स के अनुक्रम की व्याख्या कैसे करें। प्रकार परिभाषित करते हैं: कितने बाइट्स पर विचार करना है और उन बाइट्स की व्याख्या कैसे करनी है। एक intमें 4 बाइट्स 2 के पूरक हैं और एक unsigned intमें 4 बाइट्स सादा द्विआधारी संकेतन (का उपयोग कर अपने सिस्टम पर वास्तविक प्रकार आकार की जांच sizeofऑपरेटर)।
mw215

1

आप स्टैनफोर्ड से प्रोफेसर जेरी कैन को दो के पूरक की व्याख्या करते हुए देख सकते हैं, दूसरे व्याख्यान में (स्टैंडिंग 2 के पूरक के बारे में स्पष्टीकरण 13:00 के आसपास शुरू होता है) स्टैंडिंगफोर्ड के यूट्यूब चैनल से देखने के लिए उपलब्ध प्रोग्रामिंग पैराडिम्स नामक श्रृंखला में। यहाँ व्याख्यान श्रृंखला का लिंक दिया गया है: http://www.youtube.com/view_play_list?p=9D558D49CA7343402


0

दो के पूरक का उपयोग किया जाता है क्योंकि यह सर्किटरी में लागू करने के लिए सरल है और एक नकारात्मक शून्य की अनुमति नहीं देता है।

यदि x बिट्स हैं, तो दो का पूरक + (2 ^ x / 2 + 1) से - (2 ^ x / 2) तक होगा। एक का पूरक + (2 ^ x / 2) से (2 ^ x / 2) तक चलेगा, लेकिन एक नकारात्मक शून्य (0000 एक 4 बिट 1 के पूरक प्रणाली में 1000 के बराबर है) को अनुमति देगा।


0

खैर, आपका इरादा वास्तव में आपके बाइनरी नंबर के सभी बिट्स को उल्टा करना नहीं है। यह वास्तव में 1 से अपने प्रत्येक अंक को घटाना है। यह केवल एक भाग्यशाली संयोग है कि 1 में 1 परिणाम से 1 घटाना और 0 में 1 परिणाम से घटाना है। इसलिए फ्लिपिंग बिट्स प्रभावी रूप से इस घटाव को पूरा कर रहा है।

लेकिन आप 1 से प्रत्येक अंक का अंतर क्यों खोज रहे हैं? ठीक है, तुम नहीं हो। आपका वास्तविक इरादा किसी अन्य बाइनरी नंबर से दिए गए बाइनरी नंबर के अंतर की गणना करना है, जिसमें अंकों की समान संख्या है लेकिन इसमें केवल 1 है। उदाहरण के लिए यदि आपका नंबर 10110001 है, जब आप उन सभी बिट्स को फ्लिप करते हैं, तो आप प्रभावी रूप से कंप्यूटिंग कर रहे हैं (11111111 - 10110001)।

यह दो के पूरक की गणना में पहला कदम बताता है। अब चलो दूसरा चरण शामिल करें - चित्र में 1 - भी जोड़ रहा है।

उपरोक्त बाइनरी समीकरण में 1 जोड़ें:

11111111 - 10110001 + 1

आपको क्या मिलेगा? यह:

100000000 - 10110001

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

लेकिन हम वास्तव में इस अंतर के बाद हेंकेरिन क्यों हैं? खैर, यहाँ से, मुझे लगता है कि आप विकिपीडिया लेख पढ़ें तो बेहतर होगा ।


0

हम केवल जोड़ और घटाव दोनों के लिए जोड़-तोड़ ऑपरेशन करते हैं। हम इसके अलावा दूसरे ऑपरेंड को पहले ऑपरेंड में जोड़ते हैं। घटाव के लिए हम दूसरे ऑपरेंड के 2 के पूरक को पहले ऑपरेंड में जोड़ते हैं।

2 के पूरक प्रतिनिधित्व के साथ हमें घटाव के लिए अलग-अलग डिजिटल घटकों की आवश्यकता नहीं है - केवल योजक और पूरक का उपयोग किया जाता है।


0

यह ध्यान देने योग्य है कि कुछ शुरुआती जोड़ मशीनों पर, डिजिटल कंप्यूटर के दिनों से पहले, ऑपरेटर द्वारा प्रत्येक कुंजी पर किंवदंतियों के एक अलग रंग के सेट का उपयोग करके मूल्यों को दर्ज करके घटाव का प्रदर्शन किया जाएगा (इसलिए प्रत्येक कुंजी नौ शून्य से दर्ज की जाएगी घटाया गया), और एक विशेष बटन दबाकर एक गणना में ले जाने का अनुमान लगाया जाएगा। इस प्रकार, छह-अंकों की मशीन पर, 1234 को एक मूल्य से घटाने के लिए, ऑपरेटर उन कुंजियों को दबा देगा जो सामान्य रूप से "998,765" को दर्शाएंगे और प्रगति में गणना के लिए उस मान को जोड़ने के लिए एक बटन दबाएंगे। दो के पूरक अंकगणित बस उस पहले "दस-पूरक" अंकगणितीय के द्विआधारी समतुल्य है।


0

पूरक विधि द्वारा घटाव प्रदर्शन करने का लाभ हार्डवेयर
जटिलता में कमी है। इसके अलावा और घटाव के लिए अलग-अलग डिजिटल सर्किट की कोई आवश्यकता नहीं है। इसके अलावा और घटाव केवल योजक द्वारा किया जाता है।


0

दो-पूरक प्रतिनिधित्व का एक प्रमुख लाभ जो अभी तक यहां उल्लेख नहीं किया गया है वह यह है कि दो-पूरक योग, अंतर या उत्पाद के निचले बिट केवल ऑपरेंड के संबंधित बिट्स पर निर्भर हैं । कारण है कि -1 के लिए 8 बिट हस्ताक्षरित मूल्य यह 11111111है कि किसी भी पूर्णांक को घटाना जिसका सबसे कम 8 बिट हैं00000001 किसी अन्य पूर्णांक से हैं जिनका निम्नतम 8 बिट हैं0000000 एक पूर्णांक उत्पन्न करेंगे जिनके निम्नतम 8 बिट्स हैं11111111। गणितीय रूप से, मान -1 मान 1 का अनंत तार होगा, लेकिन किसी विशेष पूर्णांक प्रकार की सीमा के भीतर सभी मान या तो सभी 1 या सभी 0 के पिछले अंक होंगे, इसलिए यह कंप्यूटर के लिए "साइन-एक्सटेंशन" के लिए सुविधाजनक है संख्या का सबसे महत्वपूर्ण बिट, हालांकि यह 1 या 0 के अनंत संख्या का प्रतिनिधित्व करता है।

दो-पूरक केवल एक हस्ताक्षरित-संख्या प्रतिनिधित्व के बारे में है जो बाइनरी मशीन के प्राकृतिक शब्द के आकार से बड़े प्रकार के साथ काम करते समय अच्छी तरह से काम करता है, जब से इसके अतिरिक्त या घटाव का प्रदर्शन होता है, तो कोड प्रत्येक ऑपरेंड के सबसे कम भाग को प्राप्त कर सकता है, सबसे कम संख्या की गणना करता है। परिणाम, और स्टोर करें कि फिर प्रत्येक ऑपरेंड के अगले हिस्से को लोड करें, परिणाम के अगले हिस्से की गणना करें, और स्टोर करें, आदि। इस प्रकार, यहां तक ​​कि एक प्रोसेसर जो सभी अतिरिक्त और घटाव के लिए एक एकल 8-बिट रजिस्टर के माध्यम से जाने की आवश्यकता है 32-बिट हस्ताक्षरित संख्याओं को कुशलता से संभाल सकता है (32-बिट रजिस्टर की तुलना में धीमा, बेशक, लेकिन अभी भी काम करने योग्य है)।

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


कृपया अपना उत्तर प्रारूप और कोड के रूप में चिह्नित करें, यह अधिक पठनीय होगा और आप उत्थान करेंगे।
सूरज जैन

@ सुरजजैन: क्या यह बेहतर है?
सुपरैट

हाँ, जो पहले था उससे बेहतर है, मैं आपसे एक बात पूछना चाहता हूँ कि हस्ताक्षरित char a = 1 और अहस्ताक्षरित char a = 1 में क्या अंतर है, उन्हें स्मृति में कैसे दर्शाया जाता है।
सूरज जैन

@ सुरजजैन: दो-पूरक प्रणालियों पर जहां "चार" "इंट" से छोटा है [अर्थात, सिस्टम का विशाल बहुमत], हस्ताक्षरित और अहस्ताक्षरित चार प्रकार पहचान के रूप में व्यवहार करेंगे, सिवाय इसके कि हस्ताक्षरित प्रकार पढ़े जाने और अहस्ताक्षरित प्रकारों पर हस्ताक्षर किए जाएंगे। नहीं होगा। इस तरह की प्रणाली पर, 194 या -62 को एक हस्ताक्षरित चार में मान को संग्रहीत करते हुए उसी बिट पैटर्न को 194 या -62 को एक अहस्ताक्षरित चार (यानी 11000010) में संग्रहीत किया जाएगा। हस्ताक्षरित चार से उस बिट पैटर्न को पढ़ने से -62 निकलेगा, और एक अहस्ताक्षरित चार से पढ़ने से 194 का उत्पादन होगा।
सुपरकैट

संकेत-विस्तारित साधन?
सूरज जैन

0

विभिन्न प्रकार के अभ्यावेदन हैं:

  1. अहस्ताक्षरित संख्या प्रतिनिधित्व
  2. हस्ताक्षरित संख्या प्रतिनिधित्व
  3. एक का पूरक प्रतिनिधित्व
  4. दो का पूरक प्रतिनिधित्व

-उपयोगी संख्या प्रतिनिधित्व केवल सकारात्मक संख्या का प्रतिनिधित्व करने के लिए इस्तेमाल किया

-Sign संख्या प्रतिनिधित्व सकारात्मक और साथ ही एक नकारात्मक संख्या का प्रतिनिधित्व करने के लिए इस्तेमाल किया। हस्ताक्षरित संख्या प्रतिनिधित्व में MSB बिट साइन बिट का प्रतिनिधित्व करता है और बाकी बिट्स संख्या का प्रतिनिधित्व करता है। जब MSB 0 का मतलब नंबर पॉजिटिव है और जब MSB 1 का मतलब नंबर नेगेटिव है।

हस्ताक्षरित संख्या प्रतिनिधित्व के साथ समस्या यह है कि 0 के लिए दो मूल्य हैं।

किसी के पूरक प्रतिनिधित्व के साथ समस्या यह है कि 0 के लिए दो मूल्य हैं।

लेकिन अगर हम दो के पूरक प्रतिनिधित्व का उपयोग करते हैं तो 0 के लिए केवल एक ही मूल्य होगा इसलिए हम दो के पूरक रूप में नकारात्मक संख्याओं का प्रतिनिधित्व करते हैं।

स्रोत: नकारात्मक संख्या को दो पूरक पूरक बाइट्सोफिगैबाइट्स में क्यों संग्रहीत किया जाता है


-1

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

अधिक जानकारी के लिए https://en.wikipedia.org/wiki/Signed_number_repretations पर जाएं

एंड-अरा-कैरी के लिए https://en.wikipedia.org/wiki/End-around_carry पर जाएं


वास्तव में, यदि आपके पास एक दशमलव बिंदु है और इस बारे में स्पष्ट है कि सभी बिट्स क्या हैं: "0..0000.1111..1" का अर्थ है कि सभी बाएं-सबसे अस्थिर बिट 0 हैं, और सभी दाएं-सबसे अस्थिर बिट 1 हैं, और इसलिए ".. 1" का अर्थ है कि एक कैरी ट्रिगर है। इसलिए यह (यंत्रवत्) "0.0001.0000..0" है। इसका मतलब है कि "1..1111.1111..1" शून्य के बराबर है! इसका मतलब यह भी है कि पूर्णांक को नकारने के लिए, आप वास्तव में इसके बिट्स को फ्लिप करते हैं। लेकिन यह अब प्रतिनिधित्व योग्य भिन्न पर लागू होता है।
रोब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.