दो का अनुपूरण

दो का पूरक एक गणितीय ऑपरेशन है जो एक सकारात्मक बाइनरी संख्या को एक नकारात्मक बाइनरी संख्या में समतुल्य नकारात्मक मान के साथ परिवर्तित करता है, जिसमें चिह्न के रूप में महानतम स्थानीय मान के साथ सबसे महत्वपूर्ण बिट|बाइनरी अंक का उपयोग किया जाता है। यह इंगित करने के लिए कि बाइनरी संख्या सकारात्मक है या नकारात्मक। इसका उपयोग कंप्यूटर विज्ञान में कंप्यूटर पर सबसे आम हस्ताक्षरित संख्या प्रतिनिधित्व (सकारात्मक, नकारात्मक और शून्य) पूर्णांक (कंप्यूटर विज्ञान) के रूप में किया जाता है। और अधिक सामान्यतः, निश्चित-बिंदु अंकगणितीय मान। जब सबसे महत्वपूर्ण बिट 1 होता है, तो संख्या को नकारात्मक के रूप में हस्ताक्षरित किया जाता है; और जब सबसे महत्वपूर्ण बिट 0 होता है तो संख्या को सकारात्मक के रूप में हस्ताक्षरित किया जाता है.

प्रक्रिया
दो का पूरक निम्न द्वारा प्राप्त किया जाता है:


 * चरण 1: समतुल्य धनात्मक संख्या से प्रारंभ करना।
 * चरण 2: सभी बिट्स को उलटना (या फ़्लिप करना) - प्रत्येक 0 से 1, और प्रत्येक 1 से 0 में बदलना;
 * चरण 3: किसी भी पूर्णांक अतिप्रवाह को अनदेखा करते हुए, संपूर्ण उलटी संख्या में 1 जोड़ना। अतिप्रवाह के लिए लेखांकन परिणाम के लिए गलत मान उत्पन्न करेगा।

उदाहरण के लिए, बाइनरी में दशमलव संख्या -6 की गणना करने के लिए:


 * चरण 1: दशमलव में +6 बाइनरी में 0110 है; सबसे बायां महत्वपूर्ण बिट (पहला 0) साइन (गणित) है। +6 110 नहीं है, क्योंकि बाइनरी में 110 दशमलव में −2 है।


 * चरण 2: 0110 में सभी बिट्स को पलटें, 1001 दें।
 * चरण 3: फ़्लिप किए गए नंबर 1001 में स्थानीय मान 1 जोड़ें, जिससे 1010 मिलता है।

यह सत्यापित करने के लिए कि 1010 का वास्तव में -6 मान है, स्थानीय मानों को एक साथ जोड़ें, लेकिन अंतिम गणना से चिह्न को घटाएँ। चूँकि पहला महत्वपूर्ण अंक संख्या चिह्न है, इसलिए सही परिणाम प्राप्त करने के लिए इसे घटाया जाना चाहिए: 1010 = (1×−2)3) + (0×22) + (1×21) + (0×20) = 1×−8 + 0 + 1×2 + 0 = −6.

सिद्धांत
दो का पूरक, पूरक की विधि का एक उदाहरण है। नाम में 'दो' शब्द को संदर्भित करता है जो, एक में पूरी तरह से विस्तारित हुआ $N$-बिट सिस्टम, वास्तव में एन की शक्ति से दो है - $2^{N}$ (एकमात्र मामला जहां इस शब्द में वास्तव में 'दो' का उत्पादन किया जाएगा $N = 1$, तो 1-बिट सिस्टम के लिए, लेकिन इनमें चिह्न और शून्य दोनों के लिए क्षमता नहीं होती है), और यह केवल यह पूर्ण शब्द है जिसके संबंध में पूरक की विधि की गणना की जाती है। इस प्रकार, दो के पूरक की सटीक परिभाषा $N$-बिट संख्या उस संख्या के संबंध में पूरक की विधि है $2^{N}$.

किसी संख्या के संबंध में पूरक होने की परिभाषित संपत्ति $2^{N}$ बस यह है कि मूल उपज के साथ इस संख्या का योग $2^{N}$. उदाहरण के लिए, तीन-बिट तक की संख्याओं के साथ बाइनरी का उपयोग करना $N = 3$ और $2^{N} = 2^{3} = 8 = 1000_{2}$, कहाँ '2'एक द्विआधारी प्रतिनिधित्व को इंगित करता है), संख्या 3 के लिए एक दो का पूरक ($011_{2}$) 5 है ($101_{2}$), क्योंकि यह मूल को सारांशित करता है $2^{3} = 1000_{2} = 011_{2} + 101_{2}$. जहां इस पत्राचार को नकारात्मक संख्याओं का प्रतिनिधित्व करने के लिए नियोजित किया जाता है, इसका प्रभावी रूप से मतलब है, दशमलव अंकों और संख्या-स्थान के साथ सादृश्य का उपयोग करके केवल 0 से 7 तक आठ गैर-नकारात्मक संख्याओं की अनुमति देना, संख्या-स्थान को दो सेटों में विभाजित करना: पहले चार संख्याएँ 0 1 2 3 वही रहती हैं, जबकि शेष चार नकारात्मक संख्याओं को एन्कोड करते हैं, अपने बढ़ते क्रम को बनाए रखते हैं, जिससे 4 एनकोड -4, 5 एनकोड -3, 6 एनकोड -2 और 7 एनकोड -1 बनाते हैं। हालाँकि, बाइनरी प्रतिनिधित्व की एक अतिरिक्त उपयोगिता है, क्योंकि सबसे महत्वपूर्ण बिट समूह (और चिह्न) को भी इंगित करता है: यह गैर-नकारात्मक के पहले समूह के लिए 0 है, और नकारात्मक के दूसरे समूह के लिए 1 है। दाईं ओर दी गई तालिकाएँ इस संपत्ति को दर्शाती हैं। किसी धनात्मक संख्या के द्विआधारी दो के पूरक की गणना का अर्थ मूलतः संख्या को घटाना है $2^{N}$. लेकिन जैसा कि तीन-बिट उदाहरण और चार-बिट के लिए देखा जा सकता है $1000_{2}$ ($2^{3}$), जो नंबर $2^{N}$ स्वयं सीमित प्रणाली में प्रतिनिधित्व योग्य नहीं होगा $N$ बिट्स, क्योंकि यह ठीक बाहर है $N$ बिट्स स्पेस (संख्या फिर भी दो के पूरक का संदर्भ बिंदु है $N$-बिट सिस्टम). इस वजह से, अधिकतम के साथ सिस्टम $N$-बिट्स को घटाव को दो परिचालनों में तोड़ना होगा: पहले अधिकतम संख्या से घटाना $N$-बिट सिस्टम, यानी $2^{N}-1$ (बाइनरी में यह शब्द वास्तव में एक साधारण संख्या है जिसमें 'सभी 1' शामिल हैं, और इसमें से घटाव केवल संख्या में सभी बिट्स को उलटा करके किया जा सकता है जिसे बिटवाइज़_ऑपरेशन #NOT के रूप में भी जाना जाता है) और फिर एक को जोड़ दिया जाता है। संयोग से, एक को जोड़ने से पहले उस मध्यवर्ती संख्या का उपयोग कंप्यूटर विज्ञान में हस्ताक्षरित संख्या प्रतिनिधित्व की एक अन्य विधि के रूप में भी किया जाता है और इसे वन्स पूरक कहा जाता है (यह नाम इसलिए दिया गया है क्योंकि ऐसी संख्या को मूल के साथ जोड़ने पर 'सभी 1' मिलते हैं)।

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

इतिहास
दशमलव जोड़ने वाली मशीनों और यांत्रिक कैलकुलेटरों में घटाव करने के लिए पूरक की विधि का उपयोग लंबे समय से किया जा रहा था। जॉन वॉन न्यूमैन ने इलेक्ट्रॉनिक संग्रहित-प्रोग्राम डिजिटल कंप्यूटर के लिए ईडीवीएसी प्रस्ताव पर एक रिपोर्ट के 1945 के पहले ड्राफ्ट में दो के पूरक बाइनरी प्रतिनिधित्व का उपयोग करने का सुझाव दिया। 1949 ईडीएसएसी, जो पहले ड्राफ्ट से प्रेरित था, ने नकारात्मक बाइनरी पूर्णांकों के दो पूरक प्रतिनिधित्व का उपयोग किया।

CDC 6600, LINC, PDP-1, और UNIVAC 1107 सहित कई प्रारंभिक कंप्यूटर, पूरक नोटेशन का उपयोग करते हैं; UNIVAC 1107, UNIVAC 1100/2200 श्रृंखला के वंशजों ने ऐसा करना जारी रखा। आईबीएम 700/7000 श्रृंखला की वैज्ञानिक मशीनें सूचकांक रजिस्टरों को छोड़कर, जो दो के पूरक हैं, संकेत/परिमाण संकेतन का उपयोग करती हैं। शुरुआती व्यावसायिक कंप्यूटरों में दो पूरक रूपों में नकारात्मक मान संग्रहीत होते हैं, जिनमें अंग्रेजी इलेक्ट्रिक ड्यूस  (1955) और  डिजिटल उपकरण निगम  [[पीडीपी-11]] (1963) और पीडीपी-6 (1964) शामिल हैं। आईबीएम सिस्टम/360|सिस्टम/360, जिसे 1964 में आईबीएम द्वारा पेश किया गया था, जो उस समय कंप्यूटर उद्योग में प्रमुख खिलाड़ी था, ने दो के पूरक को कंप्यूटर उद्योग में सबसे व्यापक रूप से इस्तेमाल किया जाने वाला बाइनरी प्रतिनिधित्व बना दिया। पहला मिनीकंप्यूटर, पीडीपी-8, जिसे 1965 में पेश किया गया था, 1969 दिनांक सामान्य नोवा, 1970 पीडीपी-11 और लगभग सभी बाद के मिनीकंप्यूटरों और माइक्रोकंप्यूटरों की तरह दो पूरक अंकगणित का उपयोग करता है।

दो के पूरक प्रतिनिधित्व से परिवर्तित करना
एक दो-पूरक संख्या प्रणाली एक द्विआधारी संख्या प्रतिनिधित्व में सकारात्मक और नकारात्मक संख्याओं को एन्कोड करती है। प्रत्येक बिट का वजन दो की शक्ति है, सबसे महत्वपूर्ण बिट को छोड़कर, जिसका वजन दो की संबंधित शक्ति का नकारात्मक है।

मूल्य$w$ की एक $N$-बिट पूर्णांक $$a_{N-1} a_{N-2} \dots a_0$$ निम्नलिखित सूत्र द्वारा दिया गया है:
 * $$w = -a_{N-1} 2^{N-1} + \sum_{i=0}^{N-2} a_i 2^i$$

सबसे महत्वपूर्ण बिट संख्या का चिह्न निर्धारित करता है और कभी-कभी इसे साइन बिट भी कहा जाता है। संकेत-और-परिमाण प्रतिनिधित्व के विपरीत, संकेत बिट का भी वजन होता है $−(2^{N − 1})$ ऊपर दिखाया गया है। का उपयोग करते हुए $N$ बिट्स, से सभी पूर्णांक $−(2^{N − 1})$ को $2^{N − 1} − 1$ का प्रतिनिधित्व किया जा सकता है।

दो के पूरक प्रतिनिधित्व में परिवर्तित करना
दो के पूरक अंकन में, एक गैर-नकारात्मक संख्या को उसकी सामान्य बाइनरी अंक प्रणाली द्वारा दर्शाया जाता है; इस मामले में, सबसे महत्वपूर्ण बिट 0 है। हालांकि, दर्शाई गई संख्याओं की सीमा अहस्ताक्षरित बाइनरी संख्याओं के समान नहीं है। उदाहरण के लिए, एक 8-बिट अहस्ताक्षरित संख्या 0 से 255 (11111111) मान का प्रतिनिधित्व कर सकती है। हालाँकि, दो की पूरक 8-बिट संख्या केवल 0 से 127 (01111111) तक गैर-नकारात्मक पूर्णांक का प्रतिनिधित्व कर सकती है, क्योंकि '1' के रूप में सबसे महत्वपूर्ण बिट के साथ बाकी बिट संयोजन नकारात्मक पूर्णांक -1 से -128 का प्रतिनिधित्व करते हैं।

दोनों का पूरक संक्रिया योगात्मक व्युत्क्रम संक्रिया है, इसलिए ऋणात्मक संख्याओं को दोनों के निरपेक्ष मान के पूरक द्वारा दर्शाया जाता है।

अपने पूरक से
एक नकारात्मक बाइनरी संख्या के दोनों पूरक प्राप्त करने के लिए, [[ अंश वाइज़ नहीं]] ऑपरेशन का उपयोग करके सभी बिट्स को उल्टा या फ़्लिप किया जाता है; फिर 1 का मान परिणामी मान में जोड़ दिया जाता है, उस अतिप्रवाह को नजरअंदाज कर दिया जाता है जो दोनों के बीच 0 का पूरक लेते समय होता है।

उदाहरण के लिए, 1 बाइट (=8 बिट्स) का उपयोग करके, दशमलव संख्या 5 को दर्शाया जाता है
 * 0000 01012

सबसे महत्वपूर्ण बिट (इस मामले में सबसे बाईं ओर का बिट) 0 है, इसलिए पैटर्न एक गैर-नकारात्मक मान का प्रतिनिधित्व करता है। दो-पूरक नोटेशन में -5 में परिवर्तित करने के लिए, सबसे पहले, सभी बिट्स उलटे होते हैं, यानी: 0 1 बन जाता है और 1 0 बन जाता है:
 * 1111 10102

इस बिंदु पर, प्रतिनिधित्व दशमलव मान -5 का पूरक है। दोनों का पूरक प्राप्त करने के लिए, परिणाम में 1 जोड़ा जाता है, जिससे:
 * 1111 10112

परिणाम एक हस्ताक्षरित बाइनरी संख्या है जो दो-पूरक रूप में दशमलव मान -5 का प्रतिनिधित्व करता है। सबसे महत्वपूर्ण बिट 1 है, इसलिए दर्शाया गया मान ऋणात्मक है।

सबसे ऋणात्मक संख्या के विशेष मामले को छोड़कर, किसी ऋणात्मक संख्या का दोनों का पूरक संगत धनात्मक मान होता है। उदाहरण के लिए, −5 (ऊपर) के बिट्स को उलटने पर यह मिलता है:
 * 0000 01002

और एक जोड़ने पर अंतिम मान मिलता है:
 * 0000 01012

इसी तरह, दोनों का शून्य का पूरक शून्य है: उलटा करने से सभी मिलते हैं, और एक जोड़ने से वापस शून्य में बदल जाता है (चूंकि अतिप्रवाह को नजरअंदाज कर दिया जाता है)।

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

2 से घटावएन
किसी संख्या और उसके इकाईयों के पूरक का योग एक है $N$-सभी 1 बिट्स के साथ बिट शब्द, जो (एक अहस्ताक्षरित बाइनरी संख्या के रूप में पढ़ा जाता है) $2^{N} − 1$. फिर इसके दोनों के पूरक में एक संख्या जोड़ने पर परिणाम प्राप्त होता है $N$ सबसे कम बिट्स को 0 और कैरी बिट 1 पर सेट किया गया है, जहां बाद वाले का वजन है (इसे एक अहस्ताक्षरित बाइनरी संख्या के रूप में पढ़ना) $2^{N}$. अत: अहस्ताक्षरित द्विआधारी अंकगणित में दो-पूरक ऋणात्मक संख्या का मान होता है $x*$ एक सकारात्मक का $x$ समानता को संतुष्ट करता है $x* = 2^{N} − x$.

उदाहरण के लिए, -5 का चार-बिट प्रतिनिधित्व खोजने के लिए (सबस्क्रिप्ट मूलांक को दर्शाते हैं):
 * $x = 0$ इसलिए $2^{N} − 0 = 2^{N}$

इसलिए, साथ $0* = 0$:

गणना पूरी तरह से आधार 10 में की जा सकती है, अंत में आधार 2 में परिवर्तित की जा सकती है:

एलएसबी से एमएसबी की ओर कार्य करना
किसी बाइनरी संख्या को उसके दो पूरक में मैन्युअल रूप से परिवर्तित करने का एक शॉर्टकट कम से कम महत्वपूर्ण बिट (एलएसबी) से शुरू करना है, और एलएसबी से सबसे महत्वपूर्ण बिट (एमएसबी) की ओर काम करते हुए सभी शून्यों को कॉपी करना है जब तक कि पहले 1 तक नहीं पहुंच जाता है; फिर उस 1 को कॉपी करें, और शेष सभी बिट्स को फ़्लिप करें (यदि प्रारंभिक संख्या संकेत-और-परिमाण प्रतिनिधित्व में थी तो MSB को 1 के रूप में छोड़ दें)। यह शॉर्टकट किसी व्यक्ति को किसी संख्या को उसके दो के पूरक में बदलने की अनुमति देता है, बिना पहले उसका पूरक बनाए। उदाहरण के लिए: दो के पूरक प्रतिनिधित्व में, 0011 1100 का निषेधन 1100 0 100 है, जहां प्रतिलिपि ऑपरेशन द्वारा रेखांकित अंक अपरिवर्तित थे (जबकि शेष अंक फ़्लिप किए गए थे)।

कंप्यूटर सर्किट्री में, यह विधि पूरक और एक विधि जोड़ने से तेज़ नहीं है; दोनों तरीकों में तर्क परिवर्तन को बढ़ावा देने के लिए दाएं से बाएं तक क्रमिक रूप से काम करने की आवश्यकता होती है। किसी को पूरक करने और जोड़ने की विधि को एक मानक कैरी लुक-फ़ॉरवर्ड योजक सर्किट द्वारा तेज़ किया जा सकता है; एमएसबी विधि की ओर एलएसबी को एक समान तर्क परिवर्तन द्वारा तेज किया जा सकता है।

साइन एक्सटेंशन
एक निश्चित संख्या में बिट्स वाली दो-पूरक संख्या को अधिक बिट्स वाली संख्या में बदलते समय (उदाहरण के लिए, एक-बाइट वेरिएबल से दो-बाइट वेरिएबल में कॉपी करते समय), सबसे महत्वपूर्ण बिट को सभी अतिरिक्त बिट्स में दोहराया जाना चाहिए. कुछ प्रोसेसर एक ही निर्देश में ऐसा करते हैं; अन्य प्रोसेसरों पर, प्रासंगिक बिट्स या बाइट्स को सेट करने के लिए कोड के बाद एक कंडीशनल का उपयोग किया जाना चाहिए।

इसी तरह, जब किसी संख्या को दाईं ओर स्थानांतरित किया जाता है, तो सबसे महत्वपूर्ण बिट, जिसमें साइन जानकारी होती है, को बनाए रखा जाना चाहिए। हालाँकि, जब बाईं ओर स्थानांतरित किया जाता है, तो थोड़ा सा बाहर स्थानांतरित हो जाता है। ये नियम सामान्य शब्दार्थ को संरक्षित करते हैं कि बायीं पाली संख्या को दो से गुणा करती है और दाहिनी पाली संख्या को दो से विभाजित करती है। हालाँकि, यदि सबसे महत्वपूर्ण बिट 0 से 1 (और इसके विपरीत) में बदल जाता है, तो उस स्थिति में ओवरफ्लो कहा जाता है जब मान एक हस्ताक्षरित पूर्णांक का प्रतिनिधित्व करता है।

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

सबसे नकारात्मक संख्या
केवल एक अपवाद के साथ, दो-पूरक प्रतिनिधित्व में किसी भी संख्या से शुरू करते हुए, यदि सभी बिट्स फ़्लिप किए जाते हैं और 1 जोड़ा जाता है, तो उस संख्या के नकारात्मक का दो-पूरक प्रतिनिधित्व प्राप्त होता है। सकारात्मक 12 नकारात्मक 12 बन जाता है, सकारात्मक 5 नकारात्मक 5 बन जाता है, शून्य शून्य हो जाता है (+ अतिप्रवाह), आदि।

श्रेणी में न्यूनतम संख्या के दोनों के पूरक (नकारात्मक) लेने से संख्या को नकारने का वांछित प्रभाव नहीं होगा। उदाहरण के लिए, दोनों एक दूसरे के पूरक हैं $2^{N}$ आठ-बिट सिस्टम में है $x = 5_{10}$ जैसा कि #−128_example_anchor में दिखाया गया है। यद्यपि नकारने से अपेक्षित परिणाम मिलता है $x = 0101_{2}$ है $N = 4$ का कोई प्रतिनिधित्व नहीं है $x* = 2^{N} − x = 2^{4} − 5_{10} = 16_{10} - 5_{10} = 10000_{2} − 0101_{2} = 1011_{2}$ आठ बिट दो की पूरक प्रणाली के साथ और इस प्रकार निषेध का प्रतिनिधित्व करना वास्तव में असंभव है। ध्यान दें कि दोनों का पूरक एक ही संख्या होने के कारण अतिप्रवाह स्थिति के रूप में पाया जाता है क्योंकि सबसे महत्वपूर्ण बिट में कैरी था लेकिन बाहर नहीं।

गणितीय रूप से, यह इस तथ्य का पूरक है कि का नकारात्मक $x* = 2^{N} − x = 2^{4} − 5_{10} = 11_{10} = 1011_{2}$ फिर से है $−128$: बिट्स की दी गई संख्या के लिए, $N$, बाइनरी संख्या 2 की एक सम संख्या होती है$k$, नकारात्मक लेना बाइनरी संख्याओं पर एक समूह क्रिया (गणित) (क्रम 2 के समूह (गणित) का) है, और चूंकि शून्य की कक्षा (समूह सिद्धांत) का क्रम 1 है, कम से कम एक अन्य संख्या की कक्षा होनी चाहिए कक्षाओं के क्रम को सेट के क्रम में जोड़ने के लिए क्रम 1। इस प्रकार नकारात्मक लेने के तहत कुछ अन्य संख्या अपरिवर्तनीय होनी चाहिए (औपचारिक रूप से, कक्षा-स्टेबलाइज़र प्रमेय द्वारा)। ज्यामितीय रूप से, कोई भी देख सकता है $k$-बिट बाइनरी संख्याएँ चक्रीय समूह के रूप में $$\ \mathbb{Z} / 2^k\ ,$$ जिसे एक वृत्त (या ठीक से एक नियमित 2) के रूप में देखा जा सकता है$k$-गॉन), और नकारात्मक लेना एक प्रतिबिंब है, जो 2:0 और विपरीत बिंदु को विभाजित करने वाले क्रम के तत्वों को, या दृष्टिगत रूप से चरम और नादिर को ठीक करता है।

सबसे नकारात्मक संख्या की उपस्थिति अप्रत्याशित प्रोग्रामिंग बग्स को जन्म दे सकती है जहां परिणाम में एक अप्रत्याशित संकेत होता है, या अप्रत्याशित अतिप्रवाह अपवाद की ओर जाता है, या पूरी तरह से अजीब व्यवहार की ओर जाता है। उदाहरण के लिए,
 * एकात्मक निषेध संचालिका किसी अशून्य संख्या का चिह्न नहीं बदल सकती। जैसे, $−128$ (कहाँ$−128$ को वैसे ही पढ़ा जाता है जैसे बन जाता है)।


 * निरपेक्ष मूल्य का कार्यान्वयन एक नकारात्मक संख्या लौटा सकता है; जैसे, $−128 ,$


 * इसी प्रकार, से गुणा करें $−128$ अपेक्षा के अनुरूप कार्य करने में विफल हो सकता है; जैसे, $+128 ,$


 * द्वारा विभाजन $+128$ एक अपवाद का कारण बन सकता है (जैसे कि द्वारा विभाजित करने के कारण होता है $0$); यहां तक ​​कि शेषफल (या मापांक) की गणना भी की जाती है $0$ इस अपवाद को ट्रिगर कर सकता है; जैसे, $−(−128) ⟼ −128$   $⟼$

C (प्रोग्रामिंग भाषा) और C++ प्रोग्रामिंग भाषाओं में, उपरोक्त व्यवहार अपरिभाषित व्यवहार हैं और न केवल वे अजीब परिणाम दे सकते हैं, बल्कि कंपाइलर यह मानने के लिए स्वतंत्र है कि प्रोग्रामर ने यह सुनिश्चित किया है कि अपरिभाषित संख्यात्मक संचालन कभी नहीं होगा, और इससे निष्कर्ष निकालें वह धारणा. यह कई अनुकूलन सक्षम करता है, लेकिन इन अपरिभाषित गणनाओं वाले कार्यक्रमों में कई अजीब बग भी पैदा करता है।

दो के पूरक में इस सबसे नकारात्मक संख्या को कभी-कभी अजीब संख्या कहा जाता है, क्योंकि यह एकमात्र अपवाद है। हालाँकि संख्या एक अपवाद है, यह नियमित दो की पूरक प्रणालियों में एक वैध संख्या है। सभी अंकगणितीय परिचालन इसके साथ एक ऑपरेंड के रूप में और (जब तक कि कोई अतिप्रवाह न हो) परिणाम के रूप में काम करते हैं।

यह क्यों काम करता है
सभी संभव का एक सेट दिया गया $k$-बिट मान, हम निचले (बाइनरी मान द्वारा) आधे को 0 से पूर्णांक मान सकते हैं $abs(−128) ⟼ −128.$ समावेशी और ऊपरी भाग होना $−1$ से −1 समावेशी। ऊपरी आधे भाग (फिर से, बाइनरी मान द्वारा) का उपयोग नकारात्मक पूर्णांकों को दर्शाने के लिए किया जा सकता है $(−128) × (−1) ⟼ −128.$ से −1 क्योंकि, अतिरिक्त मॉड्यूलो के तहत $−1$ वे उन ऋणात्मक पूर्णांकों के समान ही व्यवहार करते हैं। ऐसा इसलिए कहा जा रहा है क्योंकि $0$ सेट में कोई भी मान $−1$ के स्थान पर प्रयोग किया जा सकता है$N$. उदाहरण के लिए, आठ बिट्स के साथ, अहस्ताक्षरित बाइट्स 0 से 255 हैं। शीर्ष आधे (128 से 255) से 256 घटाने पर हस्ताक्षरित बाइट्स -128 से -1 प्राप्त होते हैं।

उस पर ध्यान देने से दो के पूरक के संबंध का एहसास होता है $(−128) ÷ (−1) ⟼ [] ,$, और $(−128) % (−1) ⟼ [].$ का पूरक है$j$.

उदाहरण

 * इस उपधारा में, दशमलव संख्याओं के साथ एक दशमलव बिंदु जोड़ा जाता है।

उदाहरण के लिए, एक 8 बिट संख्या केवल -128 से प्रत्येक पूर्णांक का प्रतिनिधित्व कर सकती है। से 127., समावेशी, तब से $(2^{N − 1} − 1)$. −95. modulo 256. 161 के बराबर है


 * −95. +256.
 * = −95. + 255. + 1
 * = 255. − 95. + 1
 * = 160. + 1.
 * =161.

<पूर्व शैली=चौड़ाई:25em > 1111 1111 255. − 0101 1111 − 95.

जोड़
दो की पूरक संख्याओं को जोड़ने के लिए किसी विशेष प्रसंस्करण की आवश्यकता नहीं होती है, भले ही ऑपरेंड में विपरीत चिह्न हों; परिणाम का चिह्न स्वचालित रूप से निर्धारित होता है. उदाहरण के लिए, 15 और −5 जोड़ने पर: <पूर्व शैली=चौड़ाई:25em > 0000 1111 (15) + 1111 1011 (−5)

घटाव
कंप्यूटर आमतौर पर घटाव को लागू करने के लिए पूरक की विधि का उपयोग करते हैं। घटाव के लिए पूरकों का उपयोग करना नकारात्मक संख्याओं का प्रतिनिधित्व करने के लिए पूरकों का उपयोग करने से निकटता से संबंधित है, क्योंकि संयोजन ऑपरेंड और परिणामों के सभी संकेतों की अनुमति देता है; प्रत्यक्ष घटाव दो-पूरक संख्याओं के साथ भी काम करता है। जोड़ की तरह, दो के पूरक का उपयोग करने का लाभ यह निर्धारित करने के लिए ऑपरेंड के संकेतों की जांच करने का उन्मूलन है कि जोड़ या घटाव की आवश्यकता है या नहीं। उदाहरण के लिए, 15 में से −5 घटाना वास्तव में 5 से 15 जोड़ना है, लेकिन यह दो-पूरक प्रतिनिधित्व द्वारा छिपा हुआ है: <पूर्व शैली=चौड़ाई:25em > 11110 000 (उधार) 0000 1111 (15) − 1111 1011 (−5)

गुणा
दो का उत्पाद $x$-बिट संख्या की आवश्यकता है $−2^{N − 1}$ बिट्स में सभी संभावित मान शामिल हैं। यदि दो के पूरक का उपयोग करते हुए दो ऑपरेंड की सटीकता गुणन से पहले दोगुनी हो जाती है, तो प्रत्यक्ष गुणन (उस सटीकता से परे किसी भी अतिरिक्त बिट को छोड़कर) सही परिणाम प्रदान करेगा। उदाहरण के लिए, लीजिए $−2^{N − 1}$. सबसे पहले, परिशुद्धता को चार बिट से आठ तक बढ़ाया जाता है। फिर आठवें बिट से आगे के बिट्स को हटाकर संख्याओं को गुणा किया जाता है (जैसा कि दिखाया गया हैx ): <पूर्व शैली=चौड़ाई:25em > 00000110 (6) * 11111011 (−5)

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

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

निम्नलिखित एल्गोरिदम (एक के लिए $N$-बिट दो का पूरक आर्किटेक्चर) परिणाम रजिस्टर आर को −1 पर सेट करता है यदि ए < बी, +1 पर यदि ए > बी, और 0 पर यदि ए और बी बराबर हैं:

दो की पूरक संख्याएँ और 2-आदिक संख्याएँ
1972 में एमआईटी एआई लैब द्वारा प्रकाशित एक क्लासिक HAKMEM में, बिल गोस्पर ने उल्लेख किया कि किसी मशीन का आंतरिक प्रतिनिधित्व दो-पूरक था या नहीं, यह दो की क्रमिक शक्तियों को जोड़कर निर्धारित किया जा सकता है। कल्पना की उड़ान में, उन्होंने नोट किया कि बीजगणितीय रूप से ऐसा करने के परिणाम से संकेत मिलता है कि बीजगणित एक मशीन (ब्रह्मांड) पर चलाया जाता है जो दो का पूरक है। गोस्पर के अंतिम निष्कर्ष को जरूरी नहीं कि गंभीरता से लिया जाए, और यह एक गणितीय मजाक के समान है। महत्वपूर्ण कदम है ...110 = ...111 - 1, यानी, 2एक्स = एक्स - 1, और इस प्रकार एक्स = ...111 = -1। यह एक ऐसी विधि की परिकल्पना करता है जिसके द्वारा 1s की एक अनंत स्ट्रिंग को एक संख्या माना जाता है, जिसके लिए प्रारंभिक अंकगणित में परिमित स्थान-मूल्य अवधारणाओं के विस्तार की आवश्यकता होती है। यह या तो सभी पूर्णांकों के लिए दो-पूरक अंकन के भाग के रूप में, एक विशिष्ट पी-एडिक संख्या|2-एडिक संख्या के रूप में, या वास्तविक संख्याओं 1 + 2 + 4 की भिन्न श्रृंखला के लिए परिभाषित सामान्यीकृत योगों में से एक के रूप में भी सार्थक है। + 8 + …|1 + 2 + 4 + 8 +···. डिजिटल अंकगणित सर्किट, अनंत (2 की सकारात्मक शक्तियों तक विस्तारित) बिट स्ट्रिंग्स के साथ संचालित करने के लिए आदर्श, दो-एडिक जोड़ और दो के पूरक प्रतिनिधित्व के साथ संगत गुणन उत्पन्न करते हैं। 2-एडिक मीट्रिक स्थान में बाइनरी अंकगणितीय और बिटवाइज़ संचालन के निरंतर कार्य का क्रिप्टोग्राफी में भी कुछ उपयोग होता है।

भिन्न रूपांतरण
किसी संख्या को भिन्नात्मक भाग के साथ परिवर्तित करने के लिए, जैसे कि .0101, किसी को सामान्य रूपांतरण की तरह दाएं से बाएं 1s को दशमलव में परिवर्तित करना होगा। इस उदाहरण में 0101 दशमलव में 5 के बराबर है। फ़्लोटिंग पॉइंट के बाद प्रत्येक अंक एक अंश का प्रतिनिधित्व करता है जहां हर 2 का गुणक है। इसलिए, पहला 1/2 है, दूसरा 1/4 है और इसी तरह। जैसा कि ऊपर बताया गया है, पहले से ही दशमलव मान की गणना करने के बाद, केवल एलएसबी (एलएसबी = दाएं से शुरू) के हर का उपयोग किया जाता है। इस रूपांतरण का अंतिम परिणाम 5/16 है।

उदाहरण के लिए, इस विधि के काम करने के लिए .0110 का फ़्लोटिंग मान होने पर, किसी को दाईं ओर से अंतिम 0 पर विचार नहीं करना चाहिए। इसलिए, 0110 के लिए दशमलव मान की गणना करने के बजाय, हम मान 011 की गणना करते हैं, जो दशमलव में 3 है (अंत में 0 छोड़ने पर, हर 2 के साथ परिणाम 6 होता)4= 16, जो घटकर 3/8 हो जाता है)। हर 8 है, जो अंतिम परिणाम 3/8 देता है।

यह भी देखें

 * प्रभाग एल्गोरिथ्म, जिसमें दो-पूरक अभ्यावेदन में विभाजन को पुनर्स्थापित करना और गैर-पुनर्स्थापित करना शामिल है
 * ऑफसेट बाइनरी
 * पी-एडिक नंबर|पी-एडिक नंबर
 * पूरक की विधि, अन्य संख्या आधारों का सामान्यीकरण, यांत्रिक कैलकुलेटर पर उपयोग किया जाता है

अग्रिम पठन

 * Two's Complement Explanation, (Thomas Finley, 2000)



बाहरी संबंध

 * Two's complement array multiplier JavaScript simulator