2012-06-08 20 views
11

मान लीजिए कि दो पूर्णांक हैं (int x, y;)।
x नकारात्मक है और y = 0x80000000 है।ओवरफ्लो के बिना घटाव?

x + (-y) करता है जबकि ओवरफ़्लो क्यों नहीं करता है?
क्या कंप्यूटर अतिरिक्त रूप से घटाव नहीं करता है?

+0

आप कैसे जानते हैं कि यह करता है? – lindelof

+0

"कंप्यूटर सिस्टम्स, एक प्रोग्रामर के परिप्रेक्ष्य" समस्या 2.32 (पेज 87) "करने के लिए समाधान ... हम -y भी TMin के बराबर होगा, और इसलिए समारोह tadd_ok वहाँ पर विचार करेंगे नकारात्मक अतिप्रवाह होने के लिए किसी भी समय एक्स नकारात्मक है। में तथ्य, xy इन मामलों के लिए बहती नहीं है ... " – Yuu

उत्तर

8

अपने पहले सवाल का जवाब करने के लिए, 0x80000000 (-+२१४७४८३६४८) पर हस्ताक्षर किए पूर्णांक के लिए न्यूनतम 32-बिट मूल्य का प्रतिनिधित्व करता। 2,147,483,647 अधिकतम मूल्य है। Two's Complement का उपयोग करते समय अधिकतम मान की परिमाण न्यूनतम मान की परिमाण से कम है। (-y) को अकेले ले जाया जा सकता है क्योंकि यह अधिकतम मूल्य (1 तक) से अधिक है। (x-y) का अंतिम पूर्णांक मान सीमा में है (दिया गया है कि x नकारात्मक है) और 32-बिट पूर्णांक द्वारा प्रदर्शित किया जा सकता है।

अपने दूसरे सवाल का जवाब करने के लिए, घटाव संख्या परिवर्तित अपनी additive उलटा में घटाया जा करने के लिए हासिल की है। इस स्थिति में अतिप्रवाह के लिए क्षमता को देखते हुए, अपने संकलक -((-x)+y) करके (x-y) के लिए सही परिणाम प्राप्त कर सकते हैं। हालांकि, यह शुद्ध अटकलें है (यह एकमात्र तरीका है जिसे मैं सुरक्षित रूप से करने के बारे में सोच सकता हूं)।