না।
কোনও ভেরিয়েবলের "ডেটা টাইপ" কেবলমাত্র সোর্স কোডে প্রাসঙ্গিক (এবং তারপরেও কেবল কিছু ভাষায়)। এটি চলকটিকে কীভাবে ভেরিয়েবলের সাথে চিকিত্সা করা যায় তা বলে iler
এই উচ্চ-স্তরের ডেটা টাইপগুলি সংকলিত (নেটিভ) কোডে বিদ্যমান নেই। তারা কোনও সংকলক কী নির্দেশাবলী জেনারেট করে তা প্রভাবিত করতে পারে তবে ডেটা অক্ষর বা সংখ্যার প্রতিনিধিত্ব করে কিনা সেগুলি নির্দেশাবলীর নিজেরাই যত্নশীল হয় না।
হার্ডওয়্যারে ভেরিয়েবলের অস্তিত্ব নেই। হার্ডওয়্যারে, আপনার কাছে মেমরির অবস্থান এবং নির্দেশাবলী থাকে যা সেগুলি চালিত করে।
কোনও ভেরিয়েবল কোনও মেমোরির স্থানে ডেটা দেখার জন্য দেখা যায় - আপনি যদি একই স্ক্রিনটি স্কুয়েট করে দেখেন এবং ভিন্নভাবে দেখান (একই ধরণের অবস্থানের সাথে বিভিন্ন ধরণের পৃথক ভেরিয়েবল), একই বাইনারি মানটির আলাদা অর্থ হতে পারে ।
উদাহরণস্বরূপ, বাইট 0x41 ইউটিএফ-8-এনকোডেড অক্ষর হিসাবে ব্যাখ্যা করা যেতে পারে A
। এটি একক-বাইট পূর্ণসংখ্যা হিসাবেও ব্যাখ্যা করা যেতে পারে 65
। এটি একাধিক বাইট পূর্ণসংখ্যা বা ভাসমান পয়েন্ট সংখ্যা বা একাধিক বাইট অক্ষর এনকোডিংয়ে একটি বাইট হিসাবে ব্যাখ্যা করা যেতে পারে। এটি বিটসেট হতে পারে 0b1000001
। একই মেমরি লোকেশনে একই বাইট থেকে সমস্ত। সি ভাষায়, আপনি এই বিভিন্ন ধরণের কাস্টিং দ্বারা এই প্রভাবটি দেখতে পারেন ।
আপনার যখন "বাফার ওভারফ্লো" থাকে, আপনি যখন আপনার সংকলক বা ভাষা আশা করতে পারেন তার সীমার বাইরে আপনি কিছু করছেন। তবে, হার্ডওয়্যারটি যতটা 1 সম্পর্কিত , আপনি মেমরির স্থানে বাইটগুলি (একক বা একাধিক) লিখছেন। একটি মেমরি অবস্থানের "টাইপ" থাকে না। আসলে, হার্ডওয়্যার এমনকি জানে না যে কোনও নির্দিষ্ট সেট বাইট আপনার কোডে একটি অ্যারে বা বাফার তৈরি করে।
আপনার কোডটিতে সেই মেমরিের অবস্থানের যেখানেই আপনি অ্যাক্সেস করবেন, নির্দেশাবলী মূলত সংজ্ঞায়িত হিসাবে চলবে। উদাহরণস্বরূপ যদি তারা সেখানে কোনও সংখ্যা প্রত্যাশা করে থাকে তবে তারা যে কোনও ডেটা বাইটের উপর নির্ভর করে যেমন তারা একটি সংখ্যা they
আপনার উদাহরণটি ব্যবহার করার জন্য, ধরে নেওয়া আপনার 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
। এখন, আপনি যদি স্বাক্ষরযুক্ত স্বতন্ত্র ( uint
) হিসাবে একই মেমরিটি ব্যাখ্যা করেন তবে এটি 4022250974
পরিবর্তে হবে। মেমরিতে ঠিক একই ডেটার জন্য অর্থটি আপনি কীভাবে দেখেন তার উপর সম্পূর্ণ নির্ভর করে।
1 এমন কিছু ব্যবস্থা আছে যা আপনাকে মেমরির সুরক্ষিত অঞ্চলে লেখার হাত থেকে বাধা দেয় এবং যদি আপনি এটি করার চেষ্টা করেন তবে আপনার প্রোগ্রামটি ক্রাশ করবে।
2 x86 আসলে ছোট-এন্ডিয়ান, যার অর্থ আপনি পিছনের দিকে আরও বড় মান তৈরি করে বাইটগুলি ব্যাখ্যা করেন। সুতরাং x86 এ পরিবর্তে আপনি 0xDEADBEEF
স্বাক্ষরিত -559038737
বা স্বাক্ষরবিহীন স্বাক্ষর দিতে চাইবেন 3735928559
।