"अहस्ताक्षरित int = 0" से एक कंप्यूटर '\ 0' (अशक्त चरित्र) को कैसे अलग करता है?


29

यदि दी गई स्थिति में, आपके पास वर्णों की एक सरणी है (शून्य चरित्र के साथ पाठ्यक्रम की समाप्ति) और उसके ठीक बाद, स्मृति में तत्काल अगली स्थिति में, आप 0एक अहस्ताक्षरित इंट के रूप में संग्रहीत करना चाहते हैं, तो कंप्यूटर इन दोनों के बीच अंतर कैसे करता है दो?


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

12
उसी तरह से कंप्यूटर 4 बाइट पूर्णांक से एक 4 बाइट फ्लोट को अलग नहीं कर सकता है (एक बहुत अलग संख्या reperesenting)।
हेगन वॉन एटिजन

6
जबकि 0x00 के साथ एक स्ट्रिंग को समाप्त करना आम है, ऐसी भाषाएं हैं जो लंबाई-उपसर्गों का उपयोग करती हैं। पहले बाइट या दो में स्ट्रिंग में बाइट्स की संख्या होगी। इस तरह, अंत में एक 0x00 की जरूरत नहीं है। मुझे लगता है कि पास्कल और बेसिक को याद करते हैं। शायद COBOL भी।
जलाया

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

1
@ मुख्य: पास्कल और बुनियादी हाँ के अधिकांश वेरिएंट, और PL / I और Ada - और जावा में जब से सबस्ट्रिंग साझाकरण 7u6 में गिराया गया था, प्रभावी रूप से सरणी लंबाई उपसर्ग का उपयोग करता है - लेकिन COBOL केवल सॉर्ट-ऑफ़: आप डेटा पढ़ सकते हैंpic X occurs m to n depending on v ( और गिनती कहीं भी हो सकती है, न केवल तुरंत पहले), बल्कि इसे संग्रहीत करना अधिक जटिल है।
dave_thompson_085 22

जवाबों:


86

यह नहीं है

स्ट्रिंग टर्मिनेटर एक बाइट है जिसमें सभी 0 बिट्स होते हैं।

अहस्ताक्षरित int दो या चार बाइट्स (आपके पर्यावरण पर निर्भर करता है) प्रत्येक में सभी 0 बिट्स होते हैं।

दो वस्तुओं को अलग-अलग पते पर संग्रहीत किया जाता है। आपका संकलित कोड पूर्व स्थान पर तार के लिए उपयुक्त संचालन करता है, और बाद में अहस्ताक्षरित बाइनरी संख्या के लिए उपयुक्त संचालन। (जब तक आपके पास अपने कोड में एक बग नहीं है, या कुछ खतरनाक रूप से चतुर कोड नहीं है!)

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

संपादित-जोड़ा: एक उदाहरण के रूप में: एक स्ट्रिंग बनाने वाले बाइट्स पर अंकगणित करने के लिए यह पूरी तरह से संभव है, यहां तक ​​कि सामान्य भी है। यदि आपके पास 8-बिट ASCII वर्णों की एक स्ट्रिंग है, तो आप 32 (दशमलव) जोड़ या घटाकर ऊपरी और निचले मामले के बीच स्ट्रिंग में अक्षरों को परिवर्तित कर सकते हैं। या यदि आप किसी अन्य वर्ण कोड में अनुवाद कर रहे हैं, तो आप उनके मानों को एक सरणी में सूचक के रूप में उपयोग कर सकते हैं जिनके तत्व अन्य कोड में बराबर बिट कोडिंग प्रदान करते हैं।

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

यह सुनिश्चित करने के लिए कि x86 / x64 में कुछ निर्देश हैं, जिनका उपयोग स्ट्रिंग के साथ बहुत अधिक किया जाता है - उदाहरण के लिए आरईपी उपसर्ग, - लेकिन आप केवल वांछित परिणाम प्राप्त करने पर, पूर्णांक की एक सरणी पर उनका उपयोग कर सकते हैं।


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

18
@gronostaj आपकी टिप्पणी थोड़ी भ्रामक है: C के विपरीत, C ++ स्ट्रिंग्स भी स्वचालित रूप से इस बात का ध्यान रखते हैं। C ++ को आमतौर पर निम्न-स्तरीय भाषा के रूप में भी वर्गीकृत नहीं किया जाता है (और कभी-कभी C भी नहीं है)।
कोनराड रुडोल्फ

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

8
@JamieHanrahan IA64 प्रोसेसर में NaT (या "नॉट ए थिंग") नाम का एक बिट है जो एक मान को सेट करने पर अपवाद को फेंक सकता है।
एरिक

4
@KonradRudolph "ऑटोमैटिक" का अर्थ "मूर्खतापूर्ण" नहीं है, निश्चित रूप से C ++ में नहीं
रैकैंडबॉम्बेनमैन

5

संक्षेप में कोई अंतर नहीं है (सिवाय इसके कि कोई इंट 2 या 4 बाइट्स चौड़ा है और एक चार सिर्फ 1)।

बात यह है कि सभी आधुनिक कामगार या तो अशक्त टर्मिनेटर तकनीक का उपयोग करते हैं या एक स्ट्रिंग की लंबाई संग्रहीत करते हैं। और दोनों ही मामलों में प्रोग्राम / कंप्यूटर जानता है कि यह एक स्ट्रिंग के अंत तक पहुंच गया है जब यह या तो एक अशक्त चरित्र को पढ़ता है या उसने कई पात्रों को पढ़ा है जैसा कि आकार इसे बताता है।

इस मुद्दे के साथ शुरू होता है जब अशक्त टर्मिनेटर गायब होता है या लंबाई गलत होती है, तब प्रोग्राम मेमोरी से पढ़ना शुरू कर देता है जिसे माना नहीं जाता है।


3
ओह, शॉर्ट में एक अंतर है - वास्तव में, शॉर्ट एक बहुत मशीन पर निर्भर डेटा प्रकार होने के लिए कुख्यात है :)
रैकेंडबॉम्बेनमैन

2

इसमें कोई फर्क नही है। मशीन कोड (कोडांतरक) में चर प्रकार नहीं होते हैं, इसके बजाय डेटा का प्रकार निर्देश द्वारा निर्धारित किया जाता है।

एक बेहतर उदाहरण होगा intऔर float, यदि आपके पास स्मृति में 4 बाइट्स हैं, तो इस बात की कोई जानकारी नहीं है कि यह एक intया float(या पूरी तरह से कुछ और) है, हालांकि पूर्णांक जोड़ और फ्लोट जोड़ के लिए 2 अलग-अलग निर्देश हैं, इसलिए यदि पूर्णांक जोड़ नहीं है निर्देश का उपयोग डेटा पर किया जाता है, फिर यह पूर्णांक, और इसके विपरीत है।

तार के साथ भी, यदि आपके पास कोड है, जो कहते हैं, एक पते को देखता है और बाइट्स को गिनता है जब तक कि यह एक \0बाइट तक नहीं पहुंचता है , आप इसे एक फ़ंक्शन कंप्यूटिंग स्ट्रिंग की लंबाई के रूप में सोच सकते हैं।

बेशक इस तरह की प्रोग्रामिंग पूर्ण पागलपन होगी, इसलिए हमारे पास उच्च स्तर की भाषाएं हैं जो मशीन कोड के संकलन और सीधे कोडांतरक में लगभग किसी भी कार्यक्रम को संकलित करती हैं।


2

वैज्ञानिक एकल शब्द उत्तर होगा: मेटाडेटा।

मेटाडेटा कंप्यूटर को बताता है कि क्या एक निश्चित स्थान पर कुछ डेटा एक इंट, एक स्ट्रिंग, प्रोग्राम कोड या जो कुछ भी है। यह मेटाडेटा प्रोग्राम कोड का हिस्सा हो सकता है (जैसा कि जेमी हैन्रान ने उल्लेख किया है) या इसे स्पष्ट रूप से कहीं संग्रहीत किया जा सकता है।

आधुनिक सीपीयू अक्सर प्रोग्राम कोड और डेटा क्षेत्रों (उदाहरण के लिए, NX बिट https://en.wikipedia.org/wiki/NX_bit ) को सौंपे गए मेमोरी क्षेत्रों के बीच अंतर कर सकते हैं । कुछ विदेशी हार्डवेयर भी तार और संख्या के बीच अंतर कर सकते हैं, हाँ। लेकिन सामान्य मामला यह है कि सॉफ़्टवेयर इस समस्या का ध्यान रखता है, या तो अंतर्निहित मेटाडेटा (कोड में) या स्पष्ट मेटाडेटा (ऑब्जेक्ट-ओरिएंटेड VMs अक्सर डेटा (ऑब्जेक्ट) के हिस्से के रूप में मेटाडेटा (प्रकार / वर्ग जानकारी) को संग्रहीत करता है ।

विभिन्न प्रकार के डेटा के बीच अंतर न करने का एक फायदा यह है कि कुछ ऑपरेशन बहुत सरल हो जाते हैं। I / O सबसिस्टम को यह जानने की आवश्यकता नहीं है कि क्या यह डेटा सिर्फ डिस्क से पढ़ता है या लिखता है, वास्तव में प्रोग्राम कोड, मानव पठनीय पाठ या संख्या है। यह सब बस बिट्स है जो मशीन के माध्यम से ले जाया जाता है। प्रोग्राम कोड को फैंसी टाइपिंग मुद्दों से निपटने दें।


0

यह नहीं है आप इसे करते हैं!

या आपका कंपाइलर / इंटरप्रेटर।

यदि निर्देश कंप्यूटर को 0संख्या के रूप में जोड़ने के लिए कहता है , तो वह इसे कर देगा। अगर वे कंप्यूटर को 0' \0'चार ' के रूप में पहुंचने के बाद डेटा प्रिंट करने के लिए रोकते हैं , तो वह ऐसा करेगा।

भाषाओं में यह सुनिश्चित करने के लिए तंत्र है कि डेटा का इलाज कैसे किया जाए। सी में चर प्रकार, जैसे है int, floatऔर char, और संकलक प्रत्येक डेटा प्रकार का अधिकार निर्देश उत्पन्न करते हैं। लेकिन C आपको एक चर से दूसरे प्रकार के भिन्न रूप से डेटा देने की अनुमति देता है, यहां तक ​​कि एक सूचक को एक संख्या के रूप में उपयोग किया जा सकता है। कंप्यूटर के लिए यह किसी भी अन्य की तरह सभी बिट्स है।


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