मैंने सोचा था कि 2 के पूरक की पूरी बात यह थी कि संचालन पर हस्ताक्षर किए और अहस्ताक्षरित संख्या के लिए उसी तरह लागू किया जा सकता। Wikipedia even specifically lists multiply as one of the operations that benefits। तो x86 के पास प्रत्येक, mul
और imul
के लिए अलग-अलग निर्देश क्यों हैं? क्या यह अभी भी x86-64 के लिए सच है?x86 (-64) पर हस्ताक्षरित और हस्ताक्षरित गुणात्मक निर्देश क्यों हैं?
उत्तर
जोड़ और घटाव, एक ही हैं के रूप में एक गुणा की कम आधा है। एक पूर्ण गुणा, हालांकि, नहीं है। सरल उदाहरण:
32-बिट दुक्की-पूरक में, -1 अहस्ताक्षरित मात्रा 2 ** 32 के रूप में ही प्रतिनिधित्व है - 1. हालांकि:
-1 * -1 = +1
(2**32 - 1) * (2**32 - 1) = (2**64 - 2**33 + 1)
(ध्यान दें कि कम 32-बिट दोनों परिणाम समान हैं; मेरा मतलब यह है कि जब मैं कहता हूं कि "गुणा का आधा हिस्सा" समान है)।
परिणाम सिवाय इसके कि mul और imul निर्देश है कि वे कैसे सीएफ सेट में और झंडे (ले जाने और अतिप्रवाह) के अलग 2 और 3 संकार्य संस्करणों के लिए ही होगा।
दो मामलों के बारे में सोचें: -1 * -1 बनाम 0xFFFFFFFF * 0xFFFFFFFF ओवरफ्लो के संदर्भ में और आपको विचार मिल जाएगा।
दो 16-बिट संख्या का गुणन एक 32-बिट परिणाम अर्जित करता है। यहां तक कि यदि संख्याओं में से एक "1" है, तो प्रोसेसर प्रभावी ढंग से दूसरे को 32 बिट्स तक बढ़ाएगा। एक संख्या को लंबी लंबाई तक विस्तारित करने की प्रक्रिया उन परिचालनों में से एक है जो हस्ताक्षरित और हस्ताक्षरित मूल्यों के लिए अलग हैं (अन्य महत्वपूर्ण ऑपरेशन जहां साइन मामलों की परिमाण तुलना है, जो विभाजन का एक अनिवार्य हिस्सा भी है)।
ऑपरेंड के क्या सीमा के लिए मैं mul और imul बिटवाइज़ एकसमान परिणाम की उम्मीद कर सकते हैं? जब दोनों ऑपरेंड सकारात्मक होते हैं और उनका परिणाम 2 ** 63 - 1 से अधिक नहीं होता है? (जो है, जब अहस्ताक्षरित परिणाम संकेत बिट फ्लिप करने में बहुत छोटा है) –
@JosephGarvin: नहीं, जैसे ही आप मूल लंबाई पर भी एक सा जाना, आपको अलग निर्देशों की जरूरत है। उदाहरण पर विचार करें '-1 * 1 = -1' बनाम' 0xFFFFFFFF * 1 = 0xFFFFFFFF'। –
आह निश्चित रूप से, यह समझ में आता है। परिणाम के निम्न आधे के रूप में –