हस्ताक्षरित और अहस्ताक्षरित संख्याएँ


17

एक माइक्रोप्रोसेसर में ALU एक हस्ताक्षरित संख्या के बीच अंतर कैसे करेगा, -7 जो कि 1111 द्वारा निरूपित है और एक अहस्ताक्षरित संख्या 15, जिसे 1111 भी निरूपित किया गया है?


3
: संबंधित सवाल का जवाब देखें cs.stackexchange.com/a/30047/28999 । वैसे, हस्ताक्षरित -7 को 1111 के रूप में नहीं दर्शाया गया है। यह -1 है। फिर 1111 - 0001 = 1110 पर हस्ताक्षर किए गए और अहस्ताक्षरित मामले (-2 बनाम 14)
अल्बर्ट हेंड्रिक्स

2
@AlbertHendriks निष्पक्षता में, कुछ पुराने कंप्यूटर "साइन-परिमाण प्रतिनिधित्व" (एक संकेत बिट और परिमाण बिट्स) का उपयोग करते हैं, और हम अभी भी उस शैली का उपयोग करते हैं जैसे IEEE फ़्लोट। वे दो-पूरक के साथ तुलना में काम करने के लिए सिर्फ अयोग्य और कठिन हैं। n1
ड्रेकोनिस

1
मुख्य अंतर यह है कि अधिक से अधिक Thanhan / LessThan ऑपरेटर्स कैसे व्यवहार करते हैं, और क्या राइट-शिफ्ट उच्चतम बिट के साथ भरता है। जब आप वास्तव में गुणा करते हैं और विभाजित होते हैं, तो परिणाम समान होता है।
राब


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

जवाबों:


14

संक्षिप्त और सरल उत्तर है: यह नहीं है। कोई भी आधुनिक मुख्यधारा CPU ISA आपके सोचने के तरीके को काम नहीं करता है।

सीपीयू के लिए, यह सिर्फ एक बिट पैटर्न है। यह आप पर निर्भर है, प्रोग्रामर, उस बिट पैटर्न का क्या अर्थ है, इसका ट्रैक रखता है।

सामान्य तौर पर, ISAs विभिन्न डेटा प्रकारों के बीच अंतर नहीं करते हैं, जब यह भंडारण की बात आती है। (एफपीयू में फ्लोटिंग रजिस्टरों जैसे विशेष प्रयोजन के रजिस्टरों को अनदेखा करना।) यह सीपीयू के लिए बिट्स का सिर्फ एक अर्थहीन पैटर्न है। हालांकि, ISAs कर निर्देश है कि अलग अलग तरीकों से थोड़ा पैटर्न व्याख्या कर सकते हैं के विभिन्न प्रकार की है। उदाहरण के लिए, गणित निर्देश जैसे MUL, DIV, ADD, SUBसंख्या के कुछ प्रकार के रूप में बिट पैटर्न, की व्याख्या इस तरह के रूप तार्किक निर्देश जबकि AND, OR, XORबूलियन्स की एक सरणी के रूप में यह व्याख्या। तो, यह सही प्रोग्रामर चुनने के लिए प्रोग्रामर, (या दुभाषिया या संकलक के लेखक का उपयोग करता है)।

उदाहरण के लिए, हस्ताक्षरित बनाम अहस्ताक्षरित संख्याओं के लिए अलग-अलग निर्देश हो सकते हैं। कुछ ISAs के पास द्विआधारी-कोडित दशमलव के साथ अंकगणित के लिए निर्देश भी हैं।

हालांकि, ध्यान दें कि मैंने ऊपर "आधुनिक मुख्यधारा आईएसए" लिखा था। वास्तव में गैर-मुख्यधारा या ऐतिहासिक आईएसए हैं जो अलग तरीके से काम करते हैं। उदाहरण के लिए, IBM AS / 400 के मूल 48-बिट CISC ISA के साथ-साथ वर्तमान पावर-आधारित 64-बिट RISC ISA सिस्टम जिसे अब IBM i कहा जाता है, पॉइंटर्स और अन्य मानों के बीच अंतर करता है। पॉइंटर्स को हमेशा टैग किया जाता है, और उनमें टाइप इंफॉर्मेशन और राइट्स मैनेजमेंट शामिल होता है। सीपीयू जानता है कि क्या कोई मान सूचक है या नहीं, और केवल विशेषाधिकार प्राप्त i / OS कर्नेल को स्वतंत्र रूप से पॉइंटर्स में हेरफेर करने की अनुमति है। उपयोगकर्ता अनुप्रयोग केवल उन बिंदुओं में हेरफेर कर सकते हैं जो वे स्मृति में इंगित करने के लिए सुरक्षित निर्देशों का एक छोटी संख्या का उपयोग करते हैं।

कुछ ऐतिहासिक ISA डिजाइन भी थे जिनमें कम से कम कुछ सीमित प्रकार के जागरूकता शामिल थे।


ध्यान दें कि जावा बाइटकोड भी आईएसए के रूप में गिना जाता है। और यह बहुत प्रकार के डेटा प्रकारों के बारे में परवाह करता है ...
जॉन ड्वोरक

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

@Pseudonym: ठीक है, तकनीकी रूप से, यह करता है charजो एक 16-बिट अहस्ताक्षरित प्रकार है,। बेशक, जावा बाइटकोड में अभी भी कोई अहस्ताक्षरित अंकगणितीय निर्देश नहीं हैं, क्योंकि अंकगणित के लिए किसी भी charमान को स्वचालित रूप से int(32-बिट हस्ताक्षरित) प्रचारित किया जाता है ।
इल्मरी करोनें

42

लघु संस्करण: यह नहीं पता। बताने का कोई उपाय नहीं है।

यदि 1111-7 का प्रतिनिधित्व करता है, तो आपके पास एक संकेत-परिमाण प्रतिनिधित्व है , जहां पहला बिट संकेत है और शेष बिट्स परिमाण हैं। इस मामले में, अंकगणित कुछ जटिल है, क्योंकि एक अहस्ताक्षरित ऐड और एक हस्ताक्षरित ऐड विभिन्न तर्क का उपयोग करते हैं। तो आपके पास शायद एक SADDऔर एक UADDopcode होगा, और यदि आप गलत का चयन करते हैं तो आपको निरर्थक परिणाम मिलते हैं।

अधिक बार, हालांकि, 1111-1 का प्रतिनिधित्व करता है, जिसे दो-पूरक प्रतिनिधित्व कहा जाता है । इस मामले में, ALU बस परवाह नहीं करता है अगर संख्याएं हस्ताक्षरित हैं या अहस्ताक्षरित हैं! उदाहरण के लिए, चलिए ऑपरेशन करते हैं 1110 + 0001। हस्ताक्षरित अंकगणित में, इसका अर्थ है "-2 + 1", और परिणाम -1 ( 1111) होना चाहिए । अहस्ताक्षरित अंकगणित में, इसका अर्थ "14 + 1" है, और परिणाम 15 ( 1111) होना चाहिए । इसलिए ALU नहीं जानता कि आप एक हस्ताक्षरित या अहस्ताक्षरित परिणाम चाहते हैं, और यह परवाह नहीं करता है। यह सिर्फ इसके अलावा करता है जैसे कि यह अहस्ताक्षरित था, और यदि आप उस पर हस्ताक्षर किए गए पूर्णांक के रूप में इलाज करना चाहते हैं, तो यह आपके ऊपर है।

EDIT: जैसा कि रुस्लान और डैनियल शेप्लेर ने टिप्पणी में काफी हद तक सही बताया है, कुछ ऑपरेंड्स को अभी भी अलग-अलग हस्ताक्षरित और अहस्ताक्षरित संस्करणों की आवश्यकता है, यहां तक ​​कि दो-पूरक मशीन पर भी। जोड़, घटाव, गुणा, समानता और इस तरह के सभी यह जानने के बिना ठीक काम करते हैं कि संख्याएँ हस्ताक्षरित हैं या नहीं। लेकिन विभाजन और किसी भी तुलना में अधिक / कम-तुलना की तुलना में अलग संस्करण हैं।

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


आह, गच्चा। इसके लिए धन्यवाद :)
नूरव

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

4
वहाँ भी तुलना की गई है: < <= >= >विभिन्न बनाम जबकि अहस्ताक्षरित ऑपरेंड पर हस्ताक्षर किए के लिए कर रहे हैं ==और !=signedness-नास्तिक हैं।
डैनियल शेपलर

गुणन अक्सर हस्ताक्षरित और अहस्ताक्षरित किस्मों: 0xFFFFFFFFFF * 0xFFFFFFFF 0xFFFFFFFE00000001 है, यदि अहस्ताक्षरित है और यदि हस्ताक्षर किए हैं तो 0x0000FFFFFE000001 है। इंटेल जैसे प्रोसेसर 2 रजिस्टरों में परिणाम लौटाते हैं, और शीर्ष रजिस्टर हस्ताक्षरित और अहस्ताक्षरित के लिए भिन्न होता है। नीचे का रजिस्टर दोनों स्थितियों में 1 है।
रूडी वेल्थस्यूस

9

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

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

सीपीयू में आम तौर पर हस्ताक्षरित या अहस्ताक्षरित तुलना के लिए अलग-अलग निर्देश होते हैं। उदाहरण के लिए, यदि तुलना की जानी चाहिए , तो x86 एक के CMPसाथ अनुसरण कर सकता है JL(यदि इससे कम है तो कूदें), यदि तुलना पर हस्ताक्षर किए जाने चाहिए या JB(नीचे नीचे कूदें)। फिर से, कंपाइलर या प्रोग्रामर डेटा प्रकार के लिए सही निर्देश का चयन करेगा।

कुछ अन्य निर्देश अक्सर हस्ताक्षरित और अहस्ताक्षरित वेरिएंट में आते हैं, जैसे कि सही बदलाव या एक व्यापक रजिस्टर में मूल्य को लोड करना, साइन-एक्सटेंशन के साथ या बिना।


1
यहां तक ​​कि गुणा भी अहस्ताक्षरित और हस्ताक्षरित (दो के पूरक) पूर्णांकों के लिए समान है, जब तक आपको इनपुट से अधिक बिट्स के लिए परिणाम की आवश्यकता नहीं होती है । यदि आप कुछ ऐसा कर रहे हैं जैसे 8 × 8 → 16 बिट (या 16 × 16 → 32 बिट, आदि) गुणा, हालांकि, आपको इनपुट (या मध्यवर्ती परिणाम) का विस्तार करने के लिए हस्ताक्षर करने की आवश्यकता है
इल्मरी करोनें

@ इल्मारिकारोन यह सच है; एआरएम ए 32 / ए 64 निर्देश सेट हैं, जिनमें साइन-एग्नोस्टिक मल्टीप्ले-ऐड सहित कई प्रकार के निर्देश हैं, जो केवल निचले-क्रम के बिट्स लिखते हैं, लेकिन यह भी smulhऔर umulhगुणा के केवल ऊपरी बिट्स पर हस्ताक्षर करते हैं और उन निर्देशों को अनसुना करते हैं स्रोत ऑपरेंड के रूप में दो बार एक रजिस्टर में परिणाम लौटाएं।
डेविसलर

6

यह नहीं है प्रोसेसर यह निर्देश सेट पर निर्भर करता है कि वह यह बताए कि वह किस प्रकार का डेटा देख रहा है और उसे कहां भेजना है। ऑपरेंड में ही 1s और 0s के बारे में कुछ भी नहीं है जो स्वाभाविक रूप से ALU को संकेत दे सकता है कि क्या डेटा एक चार, फ्लोट, इंट, हस्ताक्षरित इंट, आदि है। यदि 1111 एक इलेक्ट्रिक सर्किट में जा रहा है जो 2s के पूरक की उम्मीद कर रहा है, तो यह चल रहा है। एक 2s पूरक के रूप में व्याख्या की जाए।


charहार्डवेयर स्तर पर ऐसी कोई बात नहीं है। हो सकता है कि एक बार यांत्रिक टेलीप्रिंटर्स के दिनों में वापस। लेकिन आज, एक charहै सिर्फ एक संख्या के रूप में दूर के रूप में हार्डवेयर का संबंध है। अलग-अलग संख्याएँ आपकी स्क्रीन पर अलग-अलग अक्षर आकृतियों के अनुरूप होती हैं, इसका कारण यह है कि उन संख्याओं का उपयोग अलग-अलग बिटमैप या किसी बड़ी तालिका (यानी, "फ़ॉन्ट" से) के अलग-अलग ड्राइंग रूटीनों को चुनने के लिए किया जाता है।
सोलोमन स्लो

3

मैं पहले से किए गए उत्तरों को जोड़ देना चाहता हूं:

अधिकांश अन्य उत्तरों में यह ध्यान दिया जाता है कि दो-पूरक अंकगणित में परिणाम हस्ताक्षरित और अहस्ताक्षरित संख्याओं के लिए समान है:

-2 + 1 = -1     1110 + 0001 = 1111
14 + 1 = 15     1110 + 0001 = 1111

हालाँकि , इसके कुछ अपवाद भी हैं:

Division:
  -2 / 2 = -1     1110 / 0010 = 1111
  14 / 2 = 7      1110 / 0010 = 0111
Comparison:
  -2 < 2 = TRUE   1110 < 0010 = TRUE
  14 < 2 = FALSE  1110 < 0010 = FALSE
"Typical" (*) multiplication:
  -2 * 2 = -4     1110 * 0010 = 11111100
  14 * 2 = 28     1110 * 0010 = 00011100

(*) कई सीपीयू पर दो n-बिट संख्याओं के गुणन का परिणाम (2 * n) बिट्स चौड़ा होता है।

ऐसे कार्यों के लिए सीपीयू के पास हस्ताक्षरित और अहस्ताक्षरित अंकगणित के लिए अलग-अलग निर्देश हैं।

इसका मतलब है कि प्रोग्रामर (या संकलक) को हस्ताक्षरित और अहस्ताक्षरित अंकगणित के लिए अन्य निर्देशों का उपयोग करना चाहिए।

उदाहरण के लिए x86 CPU में divएक अहस्ताक्षरित विभाजन idivकरने के लिए एक निर्देश है और एक हस्ताक्षरित विभाजन करने के लिए एक निर्देश है ।

अलग-अलग "सशर्त" निर्देश (सशर्त छलांग, सेट-बिट-ऑन-कंडीशन) के साथ-साथ हस्ताक्षरित और अहस्ताक्षरित अंकगणित के लिए गुणन निर्देश भी हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.