नहीं।
एक चर का "डेटा प्रकार" केवल स्रोत कोड में प्रासंगिक है (और तब भी केवल कुछ भाषाओं में)। यह संकलक को चर का इलाज करने का तरीका बताता है।
ये उच्च-स्तरीय डेटा प्रकार संकलित (मूल) कोड में मौजूद नहीं हैं। वे प्रभावित कर सकते हैं कि एक संकलक क्या निर्देश उत्पन्न करता है, लेकिन यदि डेटा किसी वर्ण या संख्या का प्रतिनिधित्व करता है, तो निर्देशों की स्वयं परवाह नहीं करता है।
हार्डवेयर में चर मौजूद नहीं हैं। हार्डवेयर में, आपके पास स्मृति स्थान और निर्देश हैं जो उन पर काम करते हैं।
एक चर को मेमोरी स्थान पर डेटा के एक दृश्य के रूप में देखा जा सकता है - यदि आप एक ही मेमोरी को थोड़ा अलग ढंग से देखते हैं और एक ही मेमोरी को देखते हैं (एक ही स्थान पर एक ही प्रकार का संदर्भ देने वाला एक अलग चर), तो एक ही बाइनरी मान का एक अलग अर्थ हो सकता है ।
उदाहरण के लिए, बाइट 0x41 की व्याख्या UTF-8-एन्कोडेड वर्ण के रूप में की जा सकती है A
। इसे एकल-बाइट पूर्णांक के रूप में भी व्याख्या किया जा सकता है 65
। इसे मल्टी-बाइट पूर्णांक या फ्लोटिंग पॉइंट नंबर में एक बाइट या मल्टी-बाइट कैरेक्टर एन्कोडिंग में एक बाइट के रूप में भी समझा जा सकता है। यह बिटसेट हो सकता है 0b1000001
। सभी एक ही बाइट से एक ही मेमोरी लोकेशन में। सी भाषा में, आप इन विभिन्न प्रकारों के लिए कास्टिंग करके इस प्रभाव को देख सकते हैं ।
जब आपके पास "बफर ओवरफ़्लो" होता है, तो आप अपने संकलक या भाषा से जो उम्मीद कर सकते हैं उसकी सीमा के बाहर कुछ कर रहे हैं। लेकिन, जहाँ तक हार्डवेयर 1 का सवाल है , आप मेमोरी स्थान पर बाइट्स (चाहे सिंगल या मल्टीपल) लिख रहे हैं। एक स्मृति स्थान में "प्रकार" नहीं होता है। वास्तव में, हार्डवेयर यह भी नहीं जानता कि बाइट्स का कोई विशेष सेट आपके कोड में एक सरणी या बफर बनाता है।
जहाँ भी आप अगली बार उस मेमोरी लोकेशन को अपने कोड में एक्सेस करेंगे, निर्देश मूल रूप से परिभाषित होंगे। उदाहरण के लिए यदि वे वहां एक संख्या की उम्मीद कर रहे थे, तो वे डेटा के जितने भी बाइट्स पर कार्य करेंगे जैसे कि वे एक नंबर थे।
अपने उदाहरण का उपयोग करने के लिए, यह मानते हुए कि आपका int
हस्ताक्षरित 4-बाइट (32-बिट) पूर्णांक है:
+-------------+--------------------------------------------+-----------+
| Source code | char[15] | int |
+-------------+--------------------------------------------------------+
| Memory |61|61|61|62|62|62|63|63|63|64|64|64|65|65|65|EF|BE|AD|DE|
+-------------+--------------------------------------------------------+
आप देख सकते हैं कि int
अब 0xEFBEADDE
बड़े-एंडियन सिस्टम 2 को मानते हुए मेमोरी लोकेशन शामिल है । यह हस्ताक्षरित 32-बिट इंट है -272716322
। अब, यदि आप एक ही स्मृति को अहस्ताक्षरित int ( uint
) के रूप में व्याख्या करते हैं, तो यह 4022250974
इसके बजाय होगा । मेमोरी में समान डेटा के लिए, अर्थ पूरी तरह से इस बात पर निर्भर करता है कि आप इसे कैसे देखते हैं।
1 कुछ तंत्र हैं जो आपको स्मृति के संरक्षित क्षेत्रों में लिखने से रोकते हैं, और यदि आप ऐसा करने का प्रयास करते हैं तो यह आपके प्रोग्राम को क्रैश कर देगा।
2 x86 वास्तव में थोड़ा-सा एंडियन है, जिसका अर्थ है कि आप बाइट्स को एक बड़ा मूल्य बनाते हैं। तो x86 पर आप इसके बजाय 0xDEADBEEF
, हस्ताक्षरित -559038737
या अहस्ताक्षरित होंगे 3735928559
।