একটি কম্পিউটার কীভাবে 'স্বাক্ষরবিহীন int = 0 "থেকে' \ 0 '(নাল অক্ষর) পার্থক্য করে?


29

যদি কোনও নির্দিষ্ট পরিস্থিতিতে আপনার চরিত্রের অ্যারে থাকে (নাল চরিত্রের সাথে অবশ্যই শেষ হয়) এবং ঠিক এরপরেই, মেমরিতে তাত্ক্ষণিক পরবর্তী অবস্থানে আপনি 0একটি স্বাক্ষরবিহীন ইন্ট হিসাবে সংরক্ষণ করতে চান , কম্পিউটার কীভাবে এইগুলির মধ্যে পার্থক্য করে? দুই?


18
আপনি সাধারণ কম্পিউটার সম্পর্কে জিজ্ঞাসা করছেন যা সম্পর্কে উত্তরগুলি সম্পূর্ণ সঠিক। তবে, এমন কিছু আর্কিটেকচার ছিল যা ডেটা টাইপের মধ্যে পার্থক্য করতে ট্যাগযুক্ত মেমরি ব্যবহার করে ।
মাধ্যাকর্ষণ 12

12
4 বাইট পূর্ণসংখ্যা (খুব আলাদা সংখ্যার পুনরাবৃত্তি করা) থেকে কম্পিউটার 4 বাইট ফ্লোটকে একইভাবে পার্থক্য করতে পারে না।
হ্যাগেন ভন ইটজেন

6
0x00 দিয়ে একটি স্ট্রিং শেষ করার সময় সাধারণ, এমন ভাষা রয়েছে যা দৈর্ঘ্য-উপসর্গযুক্ত স্ট্রিং ব্যবহার করে। প্রথম বা বাইট দুটি স্ট্রিংয়ে বাইট সংখ্যা ধারণ করবে। এইভাবে, শেষে 0x00 প্রয়োজন হয় না। আমি মনে করি পাস্কাল এবং বেসিক এটি করছিল। সম্ভবত কোবোলও।
শয়নকামরা

@ লিট অনেকগুলি যোগাযোগের প্রোটোকলে শিরোনাম ফর্ম্যাটগুলিও রয়েছে। "হ্যালো আমি এই ধরণের বার্তা এবং আমি এই বহু বাইট দীর্ঘ"। আপনার অভ্যন্তরে জটিল ডেটা ধরণের সঞ্চয় করতে হবে তাই নাল সমাপ্তি পার্স করতে আরও জটিল হয়ে পড়ে।
ম্যাথ্রেডলার

1
@ লিট: পাস্কাল এবং বেসিকের বেশিরভাগ রূপগুলি হ্যাঁ, এবং পিএল / আই এবং অ্যাডা - এবং জাভাতে যেহেতু স্ট্রিং শেয়ারিং 7u6 এ কার্যকরভাবে অ্যারের দৈর্ঘ্যের উপসর্গটি ব্যবহার করেছে - তবে সিওবিওএল কেবল সাজানোর: আপনি থেকে ডেটা পড়তে পারেন pic X occurs m to n depending on v( এবং গণনা যে কোনও জায়গায় হতে পারে, কেবলমাত্র এর আগেই নয়) তবে এটি সংরক্ষণ করা আরও জটিল।
dave_thompson_085

উত্তর:


86

এটা না।

স্ট্রিং টার্মিনেটর একটি বাইট যা সমস্ত 0 বিট সমেত।

স্বাক্ষরবিহীন ইনট দুটি বা চারটি বাইট (আপনার পরিবেশের উপর নির্ভর করে) এর মধ্যে প্রতিটি 0 টি বিট রয়েছে।

দুটি আইটেম বিভিন্ন ঠিকানায় সংরক্ষণ করা হয়। আপনার সংকলিত কোডটি পূর্ববর্তী অবস্থানের স্ট্রিংয়ের জন্য উপযুক্ত অপারেশনগুলি সম্পাদন করে এবং পরবর্তীটিতে স্বাক্ষরযুক্ত বাইনারি সংখ্যার জন্য উপযুক্ত অপারেশন করে। (যদি না হয় আপনার কোডটিতে একটি বাগ আছে, বা কিছু বিপজ্জনকভাবে চালাক কোড রয়েছে!)

তবে এই সমস্ত বাইট সিপিইউতে একরকম দেখাচ্ছে। মেমরিতে ডেটা (বর্তমানে প্রচলিত সাধারণ নির্দেশ সেট আর্কিটেকচারে) এর সাথে কোনও ধরণের যুক্ত নেই। এটি একটি বিমূর্ততা যা কেবল উত্স কোডে বিদ্যমান এবং এর অর্থ কেবল সংকলকটি।

সম্পাদনা-যুক্ত: একটি উদাহরণ হিসাবে: এটি স্ট্রিং তৈরির বাইটগুলিতে গাণিতিক সম্পাদন করা পুরোপুরি সম্ভব, এমনকি সাধারণ। আপনার যদি 8-বিট ASCII অক্ষরের একটি স্ট্রিং থাকে, তবে আপনি 32 (দশমিক) যোগ বা বিয়োগ করে আপার এবং লোয়ার কেসের মধ্যে স্ট্রিংয়ে অক্ষরগুলিকে রূপান্তর করতে পারেন। অথবা আপনি যদি অন্য কোনও চরিত্রের কোডটিতে অনুবাদ করছেন তবে আপনি তাদের মানগুলি সূচি হিসাবে একটি অ্যারেতে ব্যবহার করতে পারেন যার উপাদানগুলি অন্য কোডে সমান বিট কোডিং সরবরাহ করে।

সিপিইউতে চরগুলি সত্যই অতিরিক্ত সংক্ষিপ্ত পূর্ণসংখ্যা হয়। (১,, ৩২, বা 64৪ এর পরিবর্তে প্রত্যেকটি আটটি বিট।) আমাদের কাছে মানুষের মানগুলি পাঠযোগ্য অক্ষরের সাথে যুক্ত হতে পারে, তবে সিপিইউ এর কোনও ধারণা নেই। এটি "নাল বাইট একটি স্ট্রিং শেষ করে" এর "সি" কনভেনশন সম্পর্কেও কিছু জানে না, (এবং অনেকে অন্যান্য উত্তর এবং মন্তব্যে উল্লেখ করেছেন যে প্রোগ্রামিং পরিবেশ রয়েছে যেখানে কনভেনশনটি মোটেই ব্যবহৃত হয়নি) ।

নিশ্চিত হওয়ার জন্য, x86 / x64 এ কিছু নির্দেশ রয়েছে যা স্ট্রিংগুলির সাথে প্রচুর পরিমাণে ব্যবহৃত হয় - যেমন - আরইপি উপসর্গ, উদাহরণস্বরূপ - তবে তারা যদি পছন্দসই ফলাফল অর্জন করে তবে আপনি ঠিক সেগুলি পূর্ণসংখ্যার অ্যারে ব্যবহার করতে পারেন।


14
এজন্য বিকাশকারীদের স্ট্রিং সম্পর্কে সতর্ক থাকতে হবে। আপনার যদি বলুন, একটানা 100 বাইট, আপনি শেষ বাইটে টার্মিনেটরের প্লাসে সেখানে বেশিরভাগ 99 1-বাইট অক্ষর ফিট করতে পারেন। আপনি যদি সেখানে 100-বাইট স্ট্রিং লিখে থাকেন তবে প্রোগ্রামটি স্ট্রিংটি শেষ হয়ে যায় তা বুঝতে সক্ষম হবে না এবং কাকতালীয় শূন্য বাইট না হওয়া পর্যন্ত পরপর বাইটগুলি পড়া চালিয়ে যাবে। যদি স্ট্রিংটি 100 বাইটের বেশি দীর্ঘ হয় তবে এটি কিছু সংলগ্ন ডেটা ওভাররাইট করবে। উচ্চ-স্তরের প্রোগ্রামিং ল্যাঙ্গুয়েজ (জাভা, সি #, জেএস ইত্যাদি) এগুলি নিজের যত্ন নেয় তবে সি, সি ++, এসেম্বলির মতো নিম্ন স্তরের ল্যাংগুলিতে এটি দেবের প্রতিক্রিয়াশীলতা।
gronostaj

18
@ গ্রনোস্টাজ আপনার মন্তব্যটি কিছুটা বিভ্রান্তিকর: সি এর থেকে আলাদা নয়, সি ++ স্ট্রিংও স্বয়ংক্রিয়ভাবে এটিকে যত্ন নিতে পারে। সি ++ কেও সাধারণত নিম্ন-স্তরের ভাষা হিসাবে শ্রেণিবদ্ধ করা হয় না (এবং এমনকি সি কখনও কখনও হয় না)।
কনরাড রুডল্ফ

5
(পুরানো) সিপিইউ আর্কিটেকচারগুলিতে ডেটা মানগুলিতে টাইপ মার্কার রয়েছে, সুতরাং পয়েন্টার হিসাবে একটি পূর্ণসংখ্যাকে ডিফার করা একটি ব্যতিক্রম দেয়।
সাইমন রিখর

8
@ জামিহানরাহান আইএ 64৪ প্রসেসরের কিছুটা নাটি বলা হয়েছে (বা "একটি জিনিস নয়") যা কোনও মান সেট করে থাকলে ব্যতিক্রম করতে পারে।
এরিকএফ

4
@ কনরাড রুডল্ফ "অটোমেটিক" এর অর্থ "বোকা" নয়, অবশ্যই সি ++ তে নেই
রেক্যান্ডবোনম্যান

5

সংক্ষেপে কোনও পার্থক্য নেই (ব্যতীত কোনও int 2 বা 4 বাইট প্রশস্ত এবং একটি চরটি কেবল 1)।

জিনিসটি হ'ল সমস্ত আধুনিক লিবারি হয় নাল টার্মিনেটর কৌশল ব্যবহার করে বা স্ট্রিংয়ের দৈর্ঘ্য সঞ্চয় করে। এবং উভয় ক্ষেত্রেই প্রোগ্রাম / কম্পিউটার জানে এটি স্ট্রিংয়ের শেষে পৌঁছেছিল যখন এটি হয় নাল অক্ষরটি পড়ে থাকে বা আকারটি যতটা অক্ষর বলে থাকে ততটি এটি পড়েছে।

এই শুরুর সমস্যাগুলি যখন নাল টার্মিনেটরটি অনুপস্থিত বা দৈর্ঘ্য ভুল হয় ততক্ষণ প্রোগ্রামটি মেমরি থেকে পড়া শুরু করে বলে মনে হয় না।


3
ওহ, সংক্ষেপে একটি পার্থক্য আছে - আসলে, শর্ট একটি খুব মেশিন নির্ভর ডেটা টাইপ হওয়ার জন্য কুখ্যাতিযুক্ত :)
রেক্যান্ডবোনম্যান

2

এখানে কোন পার্থক্য নেই. মেশিন কোড (এসেম্বলার) এর পরিবর্তনশীল প্রকার নেই, পরিবর্তে তথ্যের ধরণটি নির্দেশ দ্বারা নির্ধারিত হয়।

একটি ভাল উদাহরণ হতে পারে intএবং float, যদি আপনি মেমরি 4 বাইট আছে, এটি একটি কিনা কোন তথ্য নেই intবা float(অথবা সম্পূর্ণরূপে অন্য কিছু), কিন্তু, পূর্ণসংখ্যা উপরন্তু এবং ভাসা উপরন্তু জন্য 2 টি পৃথক নির্দেশাবলী আছে তাই যদি পূর্ণসংখ্যা উপরন্তু নির্দেশাবলী ডেটা ব্যবহার করা হয়, তারপরে এটি একটি পূর্ণসংখ্যা এবং তদ্বিপরীত।

স্ট্রিংগুলির সাথে একই, যদি আপনার এমন কোড থাকে যে, বলুন, কোনও ঠিকানা দেখেন এবং বাইট না পৌঁছানো পর্যন্ত বাইট গণনা করেন \0, আপনি এটিকে একটি ফাংশন কম্পিউটিং স্ট্রিংয়ের দৈর্ঘ্য হিসাবে ভাবতে পারেন।

অবশ্যই এর মতো প্রোগ্রামিং সম্পূর্ণ উন্মাদনা হতে পারে, তাই আমাদের উচ্চ স্তরের ভাষা রয়েছে যা মেশিন কোড এবং প্রায় এসেম্বলারের মধ্যে প্রায় নুন প্রোগ্রামগুলি সংকলন করে।


2

বৈজ্ঞানিক একক শব্দের উত্তর হবে: মেটাডেটা।

মেটাডেটা কম্পিউটারকে বলে যে কোনও নির্দিষ্ট স্থানে থাকা কিছু ডেটা কোনও ইনট, একটি স্ট্রিং, প্রোগ্রাম কোড বা যাই হোক না কেন। এই মেটাডেটা প্রোগ্রাম কোডের অংশ হতে পারে (যেমন জেমি হানরাহান উল্লেখ করেছেন) বা এটি স্পষ্টভাবে কোথাও সংরক্ষণ করা যেতে পারে।

আধুনিক সিপিইউগুলি প্রায়শই প্রোগ্রাম কোড এবং ডেটা অঞ্চলগুলিকে বরাদ্দ করা মেমরি অঞ্চলের মধ্যে পার্থক্য করতে পারে (উদাহরণস্বরূপ, এনএক্স বিট https://en.wikedia.org/wiki/NX_bit )। কিছু বিদেশী হার্ডওয়্যার স্ট্রিং এবং সংখ্যাগুলির মধ্যে পার্থক্য করতে পারে, হ্যাঁ। তবে সাধারন ক্ষেত্রে হ'ল সফ্টওয়্যার এই সমস্যাটির যত্ন নেয়, তবে অন্তর্নিহিত মেটাডেটা (কোডে) বা স্পষ্টত মেটাডেটা (অবজেক্ট-ভিত্তিক ভিএম) প্রায়শই ডেটা (বস্তু) এর অংশ হিসাবে মেটাডেটা (টাইপ / শ্রেণির তথ্য) সংরক্ষণ করে though ।

বিভিন্ন ধরণের ডেটার মধ্যে পার্থক্য না করার একটি সুবিধা হ'ল কিছু ক্রিয়াকলাপ খুব সহজ হয়ে যায়। আই / ও সাবসিস্টেমটি অগত্যা ডিস্ক থেকে পড়া বা লিখিত তথ্যটি প্রোগ্রামের কোড, মানব পাঠযোগ্য পাঠ্য বা সংখ্যাগুলি কিনা তা জানা দরকার। এটি সমস্ত ঠিক বিট যা মেশিনের মাধ্যমে পরিবহন করা হয়। প্রোগ্রাম কোডটি অভিনব টাইপিংয়ের সমস্যাগুলি মোকাবেলা করুন।


0

এটা না। তুমি এটা কর!

অথবা আপনার সংকলক / দোভাষী

যদি নির্দেশাবলী কম্পিউটারকে 0একটি সংখ্যা হিসাবে যুক্ত করতে বলে, এটি এটি করবে। যদি তারা কম্পিউটারকে 0' \0'চর হিসাবে' পৌঁছানোর পরে ডেটা মুদ্রণ বন্ধ করতে বলে , এটি এটি করবে।

ভাষার কীভাবে ডেটা চিকিত্সা করা যায় তা নিশ্চিত করার ব্যবস্থা আছে mechan সিতে ভেরিয়েবলের ধরণ রয়েছে, যেমন int, floatএবং char, এবং সংকলক প্রতিটি ডেটা টাইপের সঠিক নির্দেশাবলী উত্পন্ন করে। তবে সি আপনাকে ভেরিয়েবল থেকে বিভিন্ন ধরণের অন্য ভেরিয়েবলে ডেটা কাস্ট করতে দেয় এমনকি একটি পয়েন্টার এমনকি একটি সংখ্যা হিসাবে ব্যবহার করা যায়। কম্পিউটারে এটি অন্যান্য বিটের মতো সমস্ত বিট।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.