अहस्ताक्षरित संख्याएँ क्यों लागू की जाती हैं?


12

मैं यह पता नहीं लगा सकता कि माइक्रोप्रोसेसर सिस्टम अहस्ताक्षरित संख्या को क्यों लागू करते हैं। मुझे लगता है कि लागत सिर्फ सशर्त शाखाओं की संख्या से दोगुनी है, क्योंकि, से अधिक, .etc, की तुलना में एक अलग एल्गोरिथ्म की आवश्यकता है, फिर भी किसी भी एल्गोरिदम हैं जो अहस्ताक्षरित संख्या के लिए एक महत्वपूर्ण लाभ हैं?

आंशिक रूप से एक संकलक द्वारा समर्थित होने का विरोध करने के लिए उन्हें निर्देश सेट में रहने की आवश्यकता क्यों है?


27
मूल रूप से अहस्ताक्षरित संख्याएं मानक हैं, हस्ताक्षरित नकारात्मक संख्या प्रदान करने के लिए कार्यान्वित किए जाते हैं।
पीटर बी

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

6
@jtw एरिक कहते हैं कि नकारात्मक पिक्सेल रंग या नकारात्मक चरित्र जैसी कोई चीज नहीं है। तो इसके लिए हस्ताक्षर किए गए पूर्णांक का उपयोग करना बेकार होगा, आप पते की जगह का आधा हिस्सा छोड़ देंगे।
मार्टिन मैट

26
मुझे यकीन नहीं है कि मैं यहाँ अकेला हूँ, लेकिन मुझे यह आश्चर्यजनक रूप से दुर्लभ लगता है कि मुझे अनुप्रयोगों को विकसित करते समय हस्ताक्षरित पूर्णांक की आवश्यकता है । लगभग सभी उस समय जो मुझे चाहिए वह एक (बिना डिजाइन) प्राकृतिक संख्या (एक सकारात्मक आकार, आमतौर पर), या एक हस्ताक्षरित फ्लोटिंग-पॉइंट संख्या है। अपवाद मुद्रा जैसी चीजें हैं, लेकिन वे बहुत दुर्लभ हैं; मेरे लिए, अहस्ताक्षरित पूर्णांक आदर्श हैं और हस्ताक्षरित पूर्णांक अपवाद हैं!
थॉमस

11
एक सीपीयू के दृष्टिकोण से, बहुत सारे नंबर अहस्ताक्षरित हैं। के रूप में (.eg गणित-सही-शिफ्ट) पर हस्ताक्षर किए कुछ निर्देश बिट्स व्याख्या कर सकते हैं, लेकिन वास्तव में दो के पूरक नहीं (या बहुत कम) विशेष सर्किट अर्थ दोनों का समर्थन करने के सीपीयू के लिए आवश्यक है, अहस्ताक्षरित पूर्णांक के रूप में सीपीयू इलाज पर हस्ताक्षर किए पूर्णांकों की सुविधा देता है ।
कॉर्नस्टालक्स

जवाबों:


39

निरुपित संख्या बिट्स के अनुक्रम की एक व्याख्या है। यह सबसे सरल और सीपीयू के लिए आंतरिक रूप से सबसे अधिक उपयोग की जाने वाली व्याख्या है क्योंकि पते, और ऑप कोड बस बिट्स हैं। मेमोरी / स्टैक एड्रेसिंग और अंकगणित माइक्रोप्रोसेसर की नींव हैं, अच्छी तरह से, प्रसंस्करण। अमूर्त पिरामिड को ऊपर ले जाते हुए, बिट्स की एक और लगातार व्याख्या एक चरित्र (ASCII, यूनिकोड, EBCDIC) के रूप में होती है। इसके बाद आईईईई फ्लोटिंग पॉइंट, ग्राफिक्स के लिए आरजीबीए इत्यादि जैसी अन्य व्याख्याएं हैं। इनमें से कोई भी सरल हस्ताक्षरित संख्या नहीं है (आईईईई एफपी सरल नहीं है, और उन का उपयोग करने वाले अंकगणित बहुत जटिल हैं)।

इसके अलावा, अहस्ताक्षरित अंकगणित के साथ यह बहुत सीधे आगे है (यदि सबसे कुशलता से नहीं) दूसरों को लागू करने के लिए। इसका उलट सत्य नहीं है।


3
EBCDIC में केवल एक "I" है।
रुस्लान

4
@Ruslan - लेकिन इसका उच्चारण ऐसा है जैसे दो हैं। <g>
पीट बेकर

5
@PeteBecker नहीं यह नहीं है। EBCDIC को Eb -see-Dick उच्चारण किया जाता है।
माइक नकिस

19

तुलना संचालन के लिए हार्डवेयर लागत का थोक घटाव है। तुलना द्वारा उपयोग किए गए घटाव का उत्पादन अनिवार्य रूप से राज्य के तीन बिट्स हैं:

  • क्या सभी बिट्स शून्य हैं (अर्थात समान स्थिति),
  • परिणाम का संकेत बिट
  • घटाव का वहन (यानी 32-बिट कंप्यूटर पर 33 वां उच्च क्रम बिट)

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

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


1
अहस्ताक्षरित संख्याओं की तुलना करने के लिए घटाव की आवश्यकता नहीं होती है। यह बाएं से दाएं बिटवाइज़ तुलना द्वारा प्राप्त किया जा सकता है।
जोनाथन रोसेन

10
@JonathanRosenne लेकिन ऐसा नहीं है कि प्रोसेसर इसे कैसे लागू करते हैं। इसके विपरीत, यह 2 के पूरक प्रोसेसर के लिए लगभग अकल्पनीय है जो इसके ALU में घटाव (कैरी / लोन के बिना) के साथ लागू नहीं होता है। एक डिजाइनर के तुरंत बाद सोचा गया कि इस आवश्यक ALU का उपयोग उसी पत्थर के साथ किसी अन्य पक्षी को मारने के लिए किया जा सकता है। तुलना तब बस एक घटाव बन जाती है जहां परिणाम रजिस्टर फ़ाइल में वापस नहीं लिखा जाता है।
इविलनोटिक्सिस्ट इडोनोटेक्सिस्ट

4
+1: यह पूछे गए प्रश्न का सही उत्तर है। सारांशित करना: क्योंकि जब आप पहले ही हस्ताक्षरित हैं, तो अहस्ताक्षरित कार्यों को लागू करना लगभग मुफ्त है
पेरियाटा ब्रीटा

10
@PeriataBreatta यह दूसरे तरीके से भी काम करता है। आधुनिक सीपीयू में हस्ताक्षरित और अहस्ताक्षरित संख्या लगभग समान हैं, जो मुख्य बिंदु है जिसे ओपी ने नहीं पहचाना। यहां तक ​​कि तुलना निर्देश भी हस्ताक्षरित और अहस्ताक्षरित के लिए समान हैं - यही एक कारण है कि दो के पूरक ने हस्ताक्षर किए गए पूर्णांक के युद्धों को जीत लिया :)
लुअन

3
@svidgen> जैसा कि अन्य उत्तर में बताया गया है, यह दूसरे तरीके से काम करता है। प्राथमिक चिंता अहस्ताक्षरित संख्या है, जो मूल रूप से सब कुछ के लिए उपयोग की जाती है (मेमोरी एड्रेस, आईओ / पोर्ट, चरित्र अभ्यावेदन, ...)। हस्ताक्षर किए गए नंबर आपके द्वारा अप्रकाशित होने के बाद ही सस्ते में आते हैं, और दुर्लभ घटना में काम आते हैं जो वे वांछनीय हैं।
13

14

क्योंकि, यदि आपको कुछ ऐसा गिनना है, जो हमेशा होता है >= 0 , तो आप अनावश्यक रूप से हस्ताक्षरित पूर्णांक का उपयोग करके अपनी गिनती की जगह को आधे में काट लेंगे।

ऑटो-इंक्रीड किए गए INT PK पर विचार करें जो आप अपने डेटाबेस टेबल पर रख सकते हैं। यदि आप एक हस्ताक्षरित पूर्णांक का उपयोग करते हैं, तो आपकी तालिका HALF को कई रिकॉर्डों के रूप में संग्रहीत करती है क्योंकि यह समान लाभ के साथ समान फ़ील्ड आकार के लिए हो सकता है

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

हार्डवेयर परिप्रेक्ष्य से, अहस्ताक्षरित पूर्णांक सरल हैं। वे शायद गणित पर प्रदर्शन करने के लिए सबसे आसान बिट संरचना हैं। और, कोई शक नहीं, हम एक कंपाइलर में पूर्णांक प्रकारों (या यहां तक ​​कि फ्लोटिंग पॉइंट!) का अनुकरण करके हार्डवेयर को सरल बना सकते हैं। तो, क्यों हार्डवेयर में दोनों को अहस्ताक्षरित और हस्ताक्षरित पूर्णांक लागू किया गया है?

अच्छा ... प्रदर्शन!

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


2
इन पंक्तियों के साथ, आप सरणी की जाँच करते समय अपने आप को एक ऑपरेशन से बचा सकते हैं। यदि आप एक अहस्ताक्षरित पूर्णांक का उपयोग करते हैं, तो आपको केवल यह जांचने की आवश्यकता है कि प्रदान किया गया सूचकांक सरणी आकार से कम है (क्योंकि यह नकारात्मक नहीं हो सकता है)।
रिवलॉक

2
@ dan04 यह निश्चित रूप से हो सकता है ... लेकिन, यदि आप 0 या 1 से शुरू होने वाले ऑटो-इन्क्रीमेंटिंग int का उपयोग कर रहे हैं, जो कि बहुत आम बात है, तो आपने अपने उपलब्ध नंबरों में से आधे का उपयोग बंद कर दिया है। और जब आप अनुमान लगा सकते हैं कि आप -2 ^ 31 (या जो भी हो) की गिनती शुरू कर सकते हैं, तो आपके पास अपने आईडी स्थान के बीच में एक संभावित "बढ़त" मामला होगा।
21

1
अपने क्षेत्र को आधे में काटना एक कमजोर तर्क की तरह है। संभावना है कि अगर आपके ऐप को 2 बिलियन से अधिक की आवश्यकता है, तो इसके लिए भी 4 बिलियन से अधिक की आवश्यकता है।
corsiKa

1
@ कोर्सीका: इस कारण से, यदि इसे 4 से अधिक की आवश्यकता है, तो इसे 8 की आवश्यकता है, फिर 16, आदि। यह कहाँ समाप्त होता है?
whatsisname

1
@whatsisname आम तौर पर, आप 8, 16, 32 या 64 बिट्स के पूर्णांक प्रकारों का उपयोग करते हैं। यह कहना कि अहस्ताक्षरित बेहतर है, क्योंकि आप एक हस्ताक्षरित बाइट में सकारात्मक पूर्णांक स्थान के 31 बिट्स की सीमित सीमा के बजाय सभी 32 बिट्स प्राप्त करते हैं, ज्यादातर मामलों में ज्यादा मायने नहीं रखता है।
corsiKa

9

आपके प्रश्न में दो भाग हैं:

  1. अहस्ताक्षरित पूर्णांकों का उद्देश्य क्या है?

  2. अहस्ताक्षरित पूर्णांक मुसीबत के लायक हैं?

1. अहस्ताक्षरित पूर्णांकों का उद्देश्य क्या है?

अनसाइनड नंबर, काफी सरल, मात्राओं के एक वर्ग का प्रतिनिधित्व करते हैं जिसके लिए नकारात्मक मूल्य अर्थहीन हैं। निश्चित रूप से, आप कह सकते हैं कि "मेरे पास कितने सेब हैं?" यदि आप किसी को कुछ सेब देते हैं, तो नकारात्मक संख्या हो सकती है, लेकिन इस सवाल का क्या "मेरे पास कितनी स्मृति है?" - तुम स्मृति की एक नकारात्मक राशि नहीं हो सकती। इसलिए, अहस्ताक्षरित पूर्णांक ऐसी मात्राओं का प्रतिनिधित्व करने के लिए बहुत उपयुक्त हैं, और उन्हें हस्ताक्षर किए गए पूर्णांकों की तुलना में सकारात्मक मूल्यों की सीमा का दोगुना प्रतिनिधित्व करने में सक्षम होने का लाभ है। उदाहरण के लिए, आप 16-बिट हस्ताक्षरित पूर्णांक के साथ अधिकतम मूल्य 32767 का प्रतिनिधित्व कर सकते हैं, जबकि 16-बिट अहस्ताक्षरित पूर्णांक के साथ यह 65535 है।

2. अहस्ताक्षरित पूर्णांक मुसीबत के लायक हैं?

अहस्ताक्षरित पूर्णांक वास्तव में किसी भी परेशानी का प्रतिनिधित्व नहीं करते हैं, इसलिए, हाँ, वे इसके लायक हैं। आप देखते हैं, उन्हें "एल्गोरिदम" के एक अतिरिक्त सेट की आवश्यकता नहीं है; उन्हें लागू करने के लिए आवश्यक सर्किट्री, हस्ताक्षरित पूर्णांकों को लागू करने के लिए आवश्यक सर्किटरी का एक सबसेट है।

एक सीपीयू पर हस्ताक्षरित पूर्णांक के लिए एक गुणक नहीं है और अहस्ताक्षरित लोगों के लिए एक अलग गुणक है; इसमें सिर्फ एक गुणक है, जो ऑपरेशन की प्रकृति के आधार पर थोड़े अलग तरीके से काम करता है। हस्ताक्षरित गुणन का समर्थन करने के लिए अहस्ताक्षरित की तुलना में थोड़ी अधिक सर्किटरी की आवश्यकता होती है, लेकिन चूंकि इसे किसी भी तरह से समर्थन करने की आवश्यकता होती है, इसलिए अहस्ताक्षरित गुणन व्यावहारिक रूप से मुफ्त में आता है, यह पैकेज में शामिल है।

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

तुलना भी उसी तरह से काम करती है, क्योंकि यह कुछ भी नहीं है, लेकिन घटाना-और-त्यागना-परिणाम, केवल अंतर सशर्त शाखा (कूद) निर्देशों में है, जो सीपीयू के विभिन्न झंडों को देखकर काम करते हैं जो कि द्वारा निर्धारित होते हैं पूर्ववर्ती (तुलना) निर्देश। इस उत्तर में: /programming//a/9617990/773113 आप इंटेल x86 आर्किटेक्चर पर कैसे काम करते हैं, इसका स्पष्टीकरण पा सकते हैं। क्या होता है कि हस्ताक्षर या अहस्ताक्षरित के रूप में एक सशर्त कूद अनुदेश का पदनाम इस बात पर निर्भर करता है कि यह किस झंडे की जांच करता है।


1
मेरे सवाल ने यह सब मान लिया, एल्गोरिथ्म से मेरा मतलब था कि आदि से कम से कम के लिए नियम अलग थे। मेरे द्वारा देखी जाने वाली लागत में बहुत सारे अतिरिक्त निर्देश हैं। यदि उच्च स्तर के प्रोग्राम डेटा को बिट्स के पैटर्न के रूप में देखना पसंद करते हैं, तो इसे आसानी से एक कंपाइलर द्वारा लागू किया जा सकता है
jtw

3
@jtw - लेकिन मुद्दा यह है कि उन अतिरिक्त निर्देश वास्तव में हस्ताक्षरित संख्याओं के लिए आवश्यक निर्देशों के समान हैं , और उनके लिए आवश्यक लगभग सभी सर्किटरी साझा किए जा सकते हैं । दोनों प्रकारों को लागू करने की अतिरिक्त लागत लगभग शून्य है।
पेरिआटा ब्रेटा

1
हाँ जो मेरे सवाल का जवाब देता है, अतिरिक्त शाखा निर्देशों को जोड़ना एक छोटी सी लागत के साथ आता है और वे अक्सर अभ्यास में उपयोगी होते हैं
jtw

1
"अनसाइन्ड ऑपरेशंस के लिए कुछ अतिरिक्त हैंडलिंग की आवश्यकता होती है जब विभाजन और गुणा की बात आती है" मुझे लगता है कि आपके पास यह है कि पीछे। अहस्ताक्षरित मूल्यों के साथ गुणन और विभाजन आसान है। हस्ताक्षर किए गए ऑपरेंड से निपटने के लिए अतिरिक्त हैंडलिंग की आवश्यकता होती है।
कोड़ी ग्रे

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

7

माइक्रोप्रोसेसरों स्वाभाविक रूप से अहस्ताक्षरित हैं। हस्ताक्षरित संख्याएं वह चीज़ है जो लागू की जाती है, न कि दूसरे तरीके से।

कंप्यूटर हस्ताक्षरित संख्याओं के बिना ठीक काम कर सकता है, लेकिन यह हमें, मनुष्य को नकारात्मक संख्याओं की आवश्यकता है, इसलिए हस्ताक्षर का आविष्कार किया गया था।


4
कई माइक्रोप्रोसेसरों ने विभिन्न कार्यों के लिए हस्ताक्षरित और अहस्ताक्षरित दोनों निर्देश दिए हैं।
whatsisname

1
@whatsisname: यह विपरीत है: कई माइक्रोप्रोसेसरों में केवल अहस्ताक्षरित निर्देश होते हैं। एक कुछ पर हस्ताक्षर किए निर्देश दिया है। ऐसा इसलिए है क्योंकि 2s-पूरक अंकगणित के साथ बिट मान समान है, चाहे मौसम जिस पर हस्ताक्षर किए गए हों या अहस्ताक्षरित हों और कोई पढ़ता है वह संख्या केवल व्याख्या का विषय है - इसलिए इसे संकलक विशेषता के रूप में लागू करना आसान है। आम तौर पर केवल पुराने माइक्रोस जो प्रोग्रामर का उपयोग नहीं करते हैं मान लेते हैं कि विधानसभा कोड को पठनीय बनाने के लिए फैंसी हस्ताक्षरित निर्देश हैं।
स्लीपबेटमैन

3

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

अब अगर आपको एक उदाहरण की आवश्यकता है कि आपको इस अतिरिक्त बिट की आवश्यकता कहां होगी , तो यदि आप देखते हैं तो बहुत कुछ मिल जाएगा।

मेरा पसंदीदा उदाहरण शतरंज इंजनों में बिटबोर्ड से आता है। एक शतरंज बोर्ड पर 64 वर्ग हैं, इस प्रकार यह कई unsigned longपीढ़ी के एल्गोरिदम के लिए एकदम सही भंडारण प्रदान करता है। इस तथ्य को ध्यान में रखते हुए कि आपको द्विआधारी संचालन (साथ ही साथ शिफ्ट संचालन !!) की आवश्यकता है, यह देखना आसान है कि एमएसबी सेट होने पर क्या विशेष चीजें होने की चिंता करना आसान नहीं है। यह हस्ताक्षर किए गए लंबे समय के साथ किया जा सकता है, लेकिन अहस्ताक्षरित का उपयोग करना बहुत आसान है।


3

शुद्ध गणित की पृष्ठभूमि होने के कारण, यह किसी भी दिलचस्पी लेने वाले के लिए थोड़ा अधिक गणितीय है।

यदि हम एक 8bit हस्ताक्षरित और अहस्ताक्षरित पूर्णांक के साथ शुरू करते हैं, जो हमारे पास है वह मूल रूप से पूर्णांक modulo 256 है, तो जहां तक ​​इसके अलावा और गुणा का संबंध है, बशर्ते 2 का पूरक नकारात्मक पूर्णांक का प्रतिनिधित्व करने के लिए उपयोग किया जाता है (और यह है कि कैसे हर आधुनिक संस्करण इसे प्रस्तुत करता है) ।

जहां चीजें अलग-अलग होती हैं वे दो स्थानों पर होती हैं: एक तुलना संचालन है। एक अर्थ में, पूर्णांक मॉडुलो 256 को संख्याओं का एक चक्र माना जाता है (जैसे पूर्णांक मॉडुलो 12 पुराने जमाने के एनालॉग क्लॉकफेस पर करते हैं)। संख्यात्मक तुलना करने के लिए (x <y) सार्थक है, हमें यह तय करने की आवश्यकता है कि कौन सी संख्या दूसरों की तुलना में कम है। गणितज्ञ के दृष्टिकोण से, हम पूर्णांक modulo 256 को किसी तरह सभी पूर्णांकों के सेट में एम्बेड करना चाहते हैं। 8 बिट पूर्णांक जिसका बाइनरी प्रतिनिधित्व सभी शून्य से पूर्णांक 0 है, का मानचित्रण करना स्पष्ट बात है। फिर हम दूसरों को मैप करने के लिए आगे बढ़ सकते हैं ताकि '0 + 1' (एक रजिस्टर को शून्य करने का परिणाम हो, कुल्हाड़ी कहे, और इसे एक से बढ़ाकर, 'inc ax' के माध्यम से) पूर्णांक 1 पर जाता है, और इसी तरह। हम -1 के साथ भी ऐसा ही कर सकते हैं, उदाहरण के लिए पूर्णांक -1, '0-1' और '0-1-1' की मैपिंग पूर्णांक -2 के लिए। हमें यह सुनिश्चित करना चाहिए कि यह एम्बेडिंग एक फ़ंक्शन है, इसलिए एक एकल 8 बिट पूर्णांक को दो पूर्णांकों में मैप नहीं कर सकता है। इस प्रकार, इसका मतलब है कि अगर हम पूर्णांक के सेट में सभी संख्याओं को मैप करते हैं, तो 0 होगा, साथ ही कुछ पूर्णांक 0 से कम और कुछ से अधिक 0. कुछ अनिवार्य रूप से 255 तरीकों से ऐसा करने के लिए 8bit पूर्णांक (तदनुसार) क्या न्यूनतम आप चाहते हैं, 0 से -255 तक)। फिर आप '0 <y - x' के संदर्भ में 'x <y' को परिभाषित कर सकते हैं।

दो सामान्य उपयोग के मामले हैं, जिनके लिए हार्डवेयर समर्थन समझदार है: एक सभी नॉनजरो पूर्णांक 0 से अधिक होने के साथ, और एक लगभग 50/50 विभाजन के साथ 0. एक अन्य सभी संभावनाओं को अतिरिक्त रूप से संख्याओं का अनुवाद करके आसानी से अनुकरण किया जाता है। और उप 'ऑपरेशन से पहले, और इसके लिए आवश्यकता इतनी दुर्लभ है कि मैं आधुनिक सॉफ़्टवेयर में स्पष्ट उदाहरण के बारे में नहीं सोच सकता (क्योंकि आप बस एक बड़े मंटिसा के साथ काम कर सकते हैं, 16 बिट्स कह सकते हैं)।

दूसरा मुद्दा 16 बिट पूर्णांक के स्थान में 8 बिट पूर्णांक की मैपिंग का है। क्या -1 -1 जाता है? यह वही है जो आप चाहते हैं यदि 0xFF -1 का प्रतिनिधित्व करने के लिए है। इस मामले में, साइन-एक्सटेंडिंग समझदारी की बात है, ताकि 0xFF 0xFFFF पर जाए। दूसरी ओर, यदि 0xFF का अर्थ 255 का प्रतिनिधित्व करना था, तो आप इसे 255 पर मैप करना चाहते हैं, इसलिए 0xFFFF के बजाय 0xFFFF पर होना चाहिए।

यह 'शिफ्ट' और 'अंकगणितीय पारी' ऑपरेशनों के बीच का अंतर है।

अंततः, हालांकि, यह इस तथ्य से नीचे आता है कि सॉफ्टवेयर में इंट का पूर्णांक नहीं है, लेकिन बाइनरी में प्रतिनिधित्व है, और केवल कुछ का प्रतिनिधित्व किया जा सकता है। हार्डवेयर डिजाइन करते समय, पसंद किया जाना चाहिए कि हार्डवेयर में मूल रूप से क्या करना है। चूंकि 2 के पूरक इसके अतिरिक्त और गुणन संचालन समान हैं, इसलिए यह इस तरह से नकारात्मक पूर्णांक का प्रतिनिधित्व करने के लिए समझ में आता है। तब यह केवल संचालन की बात है जो इस बात पर निर्भर करता है कि आपके द्विआधारी निरूपण का प्रतिनिधित्व करने के लिए कौन से पूर्णांक हैं।


मुझे गणितीय दृष्टिकोण पसंद है, लेकिन केवल एक विशिष्ट बड़े आकार में पदोन्नति के बारे में सोचने के बजाय, मुझे लगता है कि यह अनंत-लंबाई बाइनरी संख्याओं के संचालन के संदर्भ में सामान्यीकरण करने के लिए अच्छा है। किसी भी संख्या से 1 घटाएँ जिसका दायाँ k अंक 0 है और परिणाम का सबसे दायाँ अंक 1 होगा, और एक इंडक्शन द्वारा सिद्ध किया जा सकता है कि यदि किसी ने अनंत संख्या में बिट्स के साथ गणित किया है, तो प्रत्येक बिट 1. अहस्ताक्षरित होगा। गणित, एक संख्या के सभी लेकिन नीचे के बिट्स को अनदेखा करता है।
सुपरकैट

2

मौजूदा हस्ताक्षरित पूर्णांक के साथ CPU डिज़ाइन में अहस्ताक्षरित पूर्णांकों को जोड़ने के लिए कार्यान्वयन लागत की जाँच करें।

एक विशिष्ट CPU को निम्नलिखित अंकगणितीय निर्देशों की आवश्यकता होती है:

  • ADD (जो दो मान जोड़ता है और यदि ऑपरेशन ओवरफ्लो होता है तो एक ध्वज सेट करता है)
  • SUB (जो एक मान को दूसरे से घटाता है और विभिन्न झंडे सेट करता है - हम नीचे इन पर चर्चा करेंगे)
  • सीएमपी (जो अनिवार्य रूप से 'सब और परिणाम त्यागें, केवल झंडे रखें')
  • LSH (बाएं बदलाव, अतिप्रवाह पर एक ध्वज सेट करें)
  • RSH (सही बदलाव, एक ध्वज सेट करें यदि 1 को स्थानांतरित कर दिया जाए)
  • उपरोक्त सभी निर्देशों के वेरिएंट जो झंडे से ले जाने / उधार लेने का काम करते हैं, इस प्रकार आपको सीपीयू रजिस्टरों की तुलना में बड़े प्रकारों पर काम करने के लिए निर्देशों को आसानी से श्रृंखलाबद्ध करने देते हैं।
  • बहु (बहुतायत से सेट झंडे, आदि - सार्वभौमिक रूप से उपलब्ध नहीं)
  • DIV (विभाजित, सेट झंडे, आदि - सीपीयू आर्किटेक्चर का एक बहुत कमी है)
  • एक छोटे पूर्णांक प्रकार (जैसे 16-बिट) से एक बड़े (जैसे 32-बिट) में ले जाएँ। हस्ताक्षरित पूर्णांकों के लिए, इसे आमतौर पर MOVSX (साइन एक्सटेंशन के साथ कदम) कहा जाता है।

इसे तार्किक निर्देशों की भी आवश्यकता है:

  • शून्य पर शाखा
  • अधिक से अधिक शाखा
  • कम पर शाखा
  • अतिप्रवाह पर शाखा
  • उपरोक्त सभी के नकारात्मक संस्करण

हस्ताक्षरित पूर्णांक तुलना पर उपरोक्त शाखाएं करने के लिए, सबसे आसान तरीका यह है कि SUB निर्देश में निम्नलिखित झंडे लगाए जाएं:

  • शून्य। सेट करें यदि घटाव शून्य के मान में हुआ।
  • ओवरफ्लो। सेट करें अगर घटाव सबसे महत्वपूर्ण बिट से एक मूल्य उधार लिया है।
  • संकेत। परिणाम के साइन बिट पर सेट करें।

फिर अंकगणितीय शाखाओं को निम्नानुसार लागू किया जाता है:

  • शून्य पर शाखा: यदि शून्य ध्वज सेट है
  • कम पर शाखा: यदि साइन ध्वज ओवरफ़्लो ध्वज के लिए अलग है
  • अधिक से अधिक शाखा: यदि साइन ध्वज ओवरफ़्लो ध्वज के बराबर है, और शून्य ध्वज स्पष्ट है।

इन की उपेक्षाओं को स्पष्ट रूप से पालन करना चाहिए कि इन्हें कैसे लागू किया जाता है।

तो आपका मौजूदा डिज़ाइन पहले से ही हस्ताक्षरित पूर्णांकों के लिए इन सभी को लागू करता है। अब विचार करें कि हमें अहस्ताक्षरित पूर्णांकों को जोड़ने के लिए क्या करने की आवश्यकता है:

  • ADD - ADD का कार्यान्वयन समान है।
  • SUB - हमें एक अतिरिक्त ध्वज जोड़ने की आवश्यकता है: कैरी झंडा तब सेट किया जाता है जब मूल्य रजिस्टर के सबसे महत्वपूर्ण बिट से परे से उधार लिया जाता है।
  • सीएमपी - नहीं बदलता है
  • LSH - नहीं बदलता है
  • आरएसएच - हस्ताक्षरित मूल्यों के लिए सही बदलाव सबसे महत्वपूर्ण बिट के मूल्य को बरकरार रखता है। अहस्ताक्षरित मूल्यों के लिए, हमें इसके बजाय इसे शून्य पर सेट करना चाहिए।
  • एमयूएल - अगर आपकी उत्पादन आकार इनपुट के रूप में एक ही है, कोई विशेष हैंडलिंग की आवश्यकता है (x86 करता है विशेष हैंडलिंग है, लेकिन केवल यह एक रजिस्टर जोड़ी में आउटपुट है क्योंकि, लेकिन ध्यान दें कि यह सुविधा वास्तव में काफी मुश्किल से ही प्रयोग किया जाता है, तो हो सकता है अहस्ताक्षरित प्रकारों की तुलना में प्रोसेसर से बाहर जाने के लिए एक अधिक स्पष्ट उम्मीदवार)
  • DIV - कोई परिवर्तन आवश्यक नहीं है
  • छोटे प्रकार से बड़े प्रकार में स्थानांतरित करें - MOVZX को जोड़ने की जरूरत है, शून्य विस्तार के साथ कदम। ध्यान दें कि MOVZX लागू करने के लिए बेहद सरल है।
  • शून्य पर शाखा - अपरिवर्तित
  • ध्वज सेट ले जाने पर कम - कूदने वाली शाखा।
  • अधिक से अधिक शाखा - कूद और शून्य दोनों स्पष्ट होने पर कूदता है।

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

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


धन्यवाद, यह मेरे सवाल का जवाब देता है, लागत छोटी है और निर्देश अक्सर उपयोगी होते हैं
jtw

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

2

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

PDP-11 पर, जिस मशीन के लिए C को पहली बार लागू किया गया था, उसमें कोई अहस्ताक्षरित पूर्णांक प्रकार नहीं थे, लेकिन हस्ताक्षरित प्रकारों का उपयोग मॉड्यूलर अंकगणित के लिए किया जा सकता है, जो कि 65535 और 0. अन्य के बीच पूर्णांक निर्देश के बजाय 32767 और -32768 के बीच लिपटा हुआ है। प्लेटफ़ॉर्म ने चीजों को साफ-सुथरा नहीं लपेटा; इसके बजाय कि कार्यान्वयनों को PDP-11 में उपयोग किए जाने वाले दो-पूरक पूर्णांक का अनुकरण करना चाहिए, भाषा ने इसके बजाय अहस्ताक्षरित प्रकार जोड़े, जिन्हें ज्यादातर बीजगणितीय छल्ले के रूप में व्यवहार करना था, और अतिप्रवाह के मामले में हस्ताक्षर किए पूर्णांक प्रकारों को अन्य तरीकों से व्यवहार करने की अनुमति दी थी।

C के शुरुआती दिनों में, कई मात्राएँ थीं जो 32767 (आम INT_MAX) से अधिक हो सकती हैं, लेकिन 65535 (आम UINT_MAX) नहीं। इस प्रकार ऐसी मात्राओं (जैसे size_t) को रखने के लिए अहस्ताक्षरित प्रकारों का उपयोग करना आम हो गया। दुर्भाग्य से, भाषा में कुछ भी नहीं है कि उन प्रकारों के बीच अंतर किया जाए जो संख्याओं के साथ सकारात्मक श्रेणी के अतिरिक्त व्यवहार करना चाहिए, बनाम प्रकार जो बीजीय रिंगों की तरह व्यवहार करना चाहिए। इसके बजाय, भाषा "इंट" से छोटे प्रकार का व्यवहार करती है जैसे कि संख्याएँ, जबकि पूर्ण आकार के प्रकार बीजीय रिंगों की तरह व्यवहार करते हैं। नतीजतन, कॉलिंग फ़ंक्शन जैसे:

uint32_t mul(uint16_t a, uint16_t b) { return a*b; }

(65535, 65535) के साथ सिस्टम पर एक परिभाषित व्यवहार होगा जहां int16 बिट्स (यानी वापसी 1) है, एक अलग व्यवहार जहां int33 बिट्स या बड़ा है (वापसी 0xFFFE0001), और सिस्टम पर अनिर्धारित व्यवहार जहां "इंट" कहीं भी है [ध्यान दें कि जीसीसी आमतौर पर INT_MAX + 1u और UINT_MAX के बीच परिणामों के साथ अंकगणितीय-सही परिणाम देगा, लेकिन कभी-कभी उपरोक्त फ़ंक्शन के लिए कोड उत्पन्न करेगा जो ऐसे मूल्यों के साथ विफल होता है!]। बहुत मददगार नहीं।

फिर भी, प्रकारों की कमी जो संख्याओं की तरह लगातार व्यवहार करती हैं या लगातार एक बीजीय अंगूठी की तरह होती है, इस तथ्य को नहीं बदलती है कि बीजीय रिंग प्रकार कुछ प्रकार की प्रोग्रामिंग के लिए लगभग अपरिहार्य हैं।

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