बायनरीमधील एएससीआयआय आणि बायनरीमधील समान दशांश मधील फरक आपण कसे सांगू शकता?


उत्तर 1:

सर्वसाधारणपणे, आपण एकट्या बिट्सद्वारे नव्हे तर करू शकत नाही. उदाहरणार्थ, बायनरीमध्ये 00111001 संख्या: ती कदाचित 57 क्रमांकाची असू शकेल, परंतु ती ASCII अंक "9" देखील असू शकते.

म्हणाले, सराव मध्ये आपण बर्‍याचदा फरक सांगू शकता. कारण आपण कार्य करीत असलेले मूल्य काय असावे याची आपल्याला कल्पना असेल. खालील सी फंक्शनचा विचार करा ज्यामध्ये त्यात एक चमकदार बग आहे:

इंट प्रिंट (इंट एन) {चार बफ [1]; इंट मी; i = 3 * n + 2; स्प्रिंटफ (बुफ, "% i \ n", i); पुट्स (बुफ); मी परत; }

हे गणना करते, प्रत्येक पूर्णांक n साठी मूल्य 3 * n + 2, हे मूल्य कन्सोलवर टाकते आणि पूर्णांक म्हणून मूल्य परत करते. तथापि, आपण या कार्याची चाचणी घेताना लक्षात घ्याल की इनपुट 9 म्हणा तर ते कन्सोल वर योग्य निकाल 29 प्रिंट करते. परंतु हे चुकीचे मूल्य परत करेल, या प्रकरणात मूल्य 57. आणि यामुळे येथे काय घडत आहे याबद्दल आपल्याला थोडा सुगावा मिळेल, कारण आपल्या लक्षात येईल की 57 हे 9 क्रमांकाचे ASCII प्रतिनिधित्व आहे, आणि तसे होते निकालाचा शेवटचा अंक

त्यानंतर आपण काही प्रयोग कराल आणि जेव्हा 2-अंकी संख्या निकाल येईल तेव्हा हे खरे असल्याचे आढळेल. उदाहरणार्थ, एन = 5 सह निकाल 17 असावा, परंतु त्याऐवजी निकाल 55 असेल तर "7" अंकीचे एएससीआयआय प्रतिनिधित्व करेल.

आणि जेव्हा निकालाला 2 पेक्षा जास्त अंक असतात तेव्हा त्याचा परिणाम अगदी विचित्र होतो. उदाहरणार्थ, एन = 50 सह, योग्य निकाल 152 कन्सोलवर टाकला आहे, परंतु परतावा मूल्य 12503 दशांश किंवा हेक्साडेसिमलमध्ये 0x3235 आहे. आपल्या लक्षात येईल की ते उलट दिशेने "25" च्या स्ट्रिंगचे ASCII चे प्रतिनिधित्व आहे किंवा निकालाचे शेवटचे दोन अंक!

तर, येथे काय होत आहे? लक्षात घ्या की कॅरेक्टर बफरमध्ये फक्त एकाच वर्णासाठी जागा आहे! सी मधील स्प्रिंटफ () फंक्शन बफर ओव्हरनन्सची तपासणी करत नाही, म्हणून ते बुफद्वारे दर्शविलेल्या मेमरीला आनंदाने लिहिेल, जर बुफ खूपच लहान असेल तर बुफसाठी आरक्षित बाइट्स ताबडतोब अधिलिखित करेल. या प्रकरणात, हे पूर्णांक i साठी आरक्षित बाइट्स आहेत आणि त्या अधिलिखित होतात. आणि नंतर i चे मूल्य या कार्याचे रिटर्न मूल्य म्हणून वापरले जात असल्याने, रिटर्न व्हॅल्यू चुकीचे असेल.

फक्त एकच प्रश्न शिल्लक आहे: परताव्यामध्ये निकालाचे अंतिम ASCII अंक का असतात, परंतु उलट क्रमाने? ते घडते कारण (आपण पीसी वर कार्य करीत आहात असे गृहित धरून) पूर्णांकचे बाइट्स “चुकीच्या मार्गाने” साठवले जातात. उदाहरणार्थ, 32-बिट पूर्णांक 0x12345678 मेमरीमध्ये बाइट्स 0x78 0x56 0x34 0x12 म्हणून संग्रहित आहे.

म्हणून, जेव्हा इनपुट एन = 50 असेल तेव्हा निकालाचा पहिला अंक बुफमध्ये संग्रहित केला जाईल, तर निकालाचे दुसरे आणि तिसरे अंक i मध्ये समाप्त होतील, जे नंतर बाइटमध्ये, 0x35 0x32 0x00 0x00 होतील. आणि जेव्हा 32-बिट संख्या म्हणून अर्थ लावले तेव्हा हे दशांश 0x3235 = 12853 चे मूल्य दर्शवते.

अंतिम टीप म्हणूनः आपण आपल्या मशीनवर खरोखर प्रयत्न करीत असाल तर त्याचे परिणाम भिन्न असू शकतात कारण या प्रकारच्या बगचा परिणाम आपल्या मशीनच्या आतील कामांवर आणि कंपाईलरवर जास्त अवलंबून असतो. उदाहरणार्थ, स्मार्टफोन बर्‍याचदा योग्य क्रमाने बाइट्स संचयित करेल, परिणामी आपल्याला एक भिन्न संख्या मिळेल. आणि आपले कंपाईलर मेमरी संरेखन समस्यांमुळे 1 बाइटपेक्षा अधिक बाइटसाठी आरक्षित ठेवू शकेल किंवा ते बफ आणि मी इतर मार्गाने संचयित करू शकेल (मी प्रथम मेमरीमध्ये, नंतर बुफ). किंवा केवळ सीपीयू रजिस्टरमध्ये निकाल ठेवून हे दूर जाऊ शकते. अशा परिस्थितीत निकाल योग्य असेल परंतु स्मृतीत काहीतरी वेगळं होईल.

सर्वसाधारणपणे, प्रोग्राम्समध्ये यासारखे बग असल्यास, सर्व बेट्स प्रत्यक्षात काय होईल याबद्दल आहेत.


उत्तर 2:

जर 48 हे एएससीआयआय चे शून्य चे प्रतिनिधित्व असेल आणि 57 हे नऊचे एएससीआयआय प्रतिनिधित्व असेल तर सर्वात कमीतकमी महत्त्वपूर्ण गोंधळ म्हणजे वास्तविक अंक होय:

0000 0000-0011 0000 = 32 + 16 + 0 = 48

0000 0001-0011 0001

0000 0010-0011 0010

0000 0011-0011 0011

0000 0100-0011 0100

0000 0101-0011 0101

0000 0110-0011 0110

0000 0111-0011 0111

0000 1000-0011 1000

0000 1001-0011 1001 = 32 + 16 + 8 + 1 = 57

किंवा फक्त; आपल्याला क्रमांक देण्यासाठी 48 वजा करा.