কেন সংক্ষিপ্ত, অন্তর্নিহিত এবং দীর্ঘ আবিষ্কার হয়েছিল?


16

আমি কষ্ট বোঝার হচ্ছে তৈরি করার সঠিক উদ্দেশ্য কি ছিল short, intআর longসি ধরনের তথ্য?

যে কারণটি আমি জিজ্ঞাসা করছি তা হ'ল মনে হচ্ছে না যে তাদের আকারগুলি আবদ্ধ - এগুলি কোনও আকারের হতে পারে , উদাহরণস্বরূপ shortকোনও আকারের চেয়ে ছোট int

কোন পরিস্থিতিতে, তখন, আপনি যখন কোনও এর পরিবর্তে কোনও ব্যবহার করবেন unsigned intবা unsigned longউদাহরণস্বরূপ, এটি করার size_tসময় বাইনারি সামঞ্জস্যের কোনও আশা রাখে না?

(আপনি যদি আকারটি না জানেন, তবে কখন কী পছন্দ করবেন তা আপনি কীভাবে জানবেন?)


2
চেক আউট করুন<stdint.h>
ব্ল্যাকজ্যাক 20:25

1
@ ব্ল্যাকজ্যাক: হাহা হ্যাঁ আমি আসলেই রয়েছি - তবে আমার ধারণা আমার প্রশ্নটি হল যে এই সমস্ত ধরণের পরিবর্তে স্থানীয়ভাবে সংজ্ঞায়িত করা হয় না কেন? এটি কি "হ্যান্ডসাইট 20/20" ইস্যু, বা এর কোনও নির্দিষ্ট কারণ ছিল?
user541686

2
সি বোঝানো উভয়ই পোর্টেবল এবং অন্তর্নিহিত হার্ডওয়্যারের কাছাকাছি ছিল। এমন প্ল্যাটফর্মগুলি ছিল যেখানে বাইটটি 8 বিট দীর্ঘ ছিল না - তবে আপনি এখনও সি ব্যবহার করতে পারবেন ডেটা ধরণের কোনও নির্দিষ্ট সেট কখনও পর্যাপ্ত হবে না, কোনও স্থির আকারের পূর্ণসংখ্যা কখনও পোর্টেবল হতে পারে না।
এসকে-লজিক 15

@ এসকে-যুক্তি: তারা বলেছে sizeof(short) == 2 * sizeof(char)বা অনুরূপ হলেও ?
ব্যবহারকারী541686

1
এমন প্ল্যাটফর্মগুলি রয়েছে যেখানে sizeof(char) == sizeof(short)এটি উপলব্ধি করে। দুর্ভাগ্যক্রমে, অবিচ্ছেদ্য সংখ্যা প্রকারগুলি নির্দিষ্ট করার উপায় নেই যে তারা সমস্ত সম্ভাব্য এবং বিদ্যমান প্ল্যাটফর্মগুলিতে ফিট করবে।
এসকে-যুক্তি

উত্তর:


12

এটি আপনি যে আর্কিটেকচারটি ব্যবহার করছেন তা দ্বারা সংজ্ঞায়িত করা হবে। একটি Zilog z80 চিপ (সাধারণ এম্বেডড চিপ) এ তারা এক আকার হতে পারে যখন তারা x86 চিপসেটে সম্পূর্ণ ভিন্ন আকারের হতে পারে। যাইহোক, আকারগুলি একে অপরের কাছে নির্ধারিত অনুপাত। মূলত সংক্ষিপ্ত এবং দীর্ঘ প্রকার নয় তবে ইন্ট টাইপের জন্য যোগ্যতা অর্জন করে। শর্ট ইনটগুলি (নিয়মিত) ইন্টের চেয়ে ছোট দৈর্ঘ্যের এক ক্রম হবে এবং দীর্ঘ ইনট হবে উচ্চতর মানের একটি ক্রম। সুতরাং আপনার ইনটটি 4 বাইটের সাথে আবদ্ধ, শর্ট কোয়ালিফায়ারটি এটি 4 বাইটের সাথে সীমাবদ্ধ, যদিও 2 বাইট খুব সাধারণ এবং দীর্ঘ কোয়ালিফায়ার এটি সম্ভাব্যত 8 বাইটে বাড়িয়ে দেয় যদিও এটি 4 বাইটের চেয়ে কম হতে পারে। মনে রাখবেন যে এটি শব্দের দৈর্ঘ্যের সাপেক্ষে একই সাথে 32 বিট সিস্টেমে আপনি সর্বোচ্চ প্রতি 4 বাইটে আউট করতে চাইনি কেন নিয়মিত ইনট হিসাবে একই দীর্ঘ করুন। সুতরাং, শর্ট ≤ ইন্ট ≤ দীর্ঘ।

তবে, আপনি যদি এটি আবার লম্বা করেন তবে আপনি পরবর্তী কক্ষে আটটি স্টোরের 8 টি পুরো বাইট সরবরাহ করতে পারেন। এটি 64৪ বিট মেশিনের শব্দের আকার যার ফলে তাদের এ জাতীয় জিনিসগুলির বিষয়ে চিন্তা করতে হবে না এবং কেবল দীর্ঘ কক্ষগুলির জন্য একটি কক্ষ ব্যবহার করুন যাতে দীর্ঘতর ইনটগুলি সত্যিকার অর্থে বিট পাওয়া যায়।

যতদূর বেছে নেওয়ার জন্য এটি জাভা প্রোগ্রামারদের উদ্বিগ্ন হওয়ার দরকার নেই এমন কিছুতে সিদ্ধ হয়। "আপনার স্থাপত্য কি?" যেহেতু এগুলি সমস্ত প্রশ্নের মধ্যে থাকা মেশিনের মেমরির শব্দের আকারের উপর নির্ভরশীল, তাই কোনটি ব্যবহার করবেন তা সিদ্ধান্ত নেওয়ার আগে আপনাকে এটিকে সামনে বুঝতে হবে। তারপরে আপনি যতটা স্মৃতি সঞ্চয় করতে পারেন তার জন্য সবচেয়ে ছোট যুক্তিসঙ্গত আকারটি বেছে নিন কারণ সেই মেমরিটি যদি আপনি সমস্ত বিট ব্যবহার করেন বা না করেন তবে বরাদ্দ দেওয়া হবে। সুতরাং আপনি যেখানে সংরক্ষণ করতে পারেন এবং যখন আপনি পারেন তখন শর্টসগুলি বাছুন এবং যখন আপনি পারবেন না তখন এবং নিয়মিত ইনটগুলি দেওয়ার চেয়ে আপনার যদি আরও বড় কিছু প্রয়োজন হয়; আপনি শব্দ সিলিং না লাগানো পর্যন্ত আপনি প্রয়োজন হিসাবে দীর্ঘতর করতে চাই। তারপরে আপনার বড় সংখ্যার রুটিন সরবরাহ করতে হবে বা লাইব্রেরি থেকে এগুলি নেওয়া দরকার।

সি ভাল "পোর্টেবল অ্যাসেমব্লি" হতে পারে তবে আপনাকে এখনও আপনার হার্ডওয়্যারটি জানতে হবে।


11
এটি একেবারেই ঠিক নয়, শর্টসগুলি ইনটগুলির চেয়ে ছোট হওয়া দরকার না, তারা ints
jk এর

আমি এটা সংশোধন করব।
ওয়ার্ল্ড ইঞ্জিনিয়ার

2
একইভাবে, দীর্ঘতরগুলি ইনটগুলির চেয়ে ছোট হতে পারে না।
ডোনাল ফেলো

1
প্রকৃতপক্ষে আমি বিশ্বাস করি এমন মেশিনগুলি রয়েছে যেখানে সংক্ষিপ্ত, দীর্ঘ এবং দীর্ঘ যেখানে ঠিক একই।
জে কে।

6

যদিও আজ, একটি "বাইট" এর অর্থ "8 বিট", এটি সর্বদা সত্য হয় নি। মেশিনগুলি 4 বিট, 8 বিট, 12 বিট, 16 বিট, 32 বিট এবং 36 বিট (এবং সম্ভবত কিছু অন্যান্য আকারের) এর ঠিকানাযোগ্য অংশগুলি ব্যবহার করেছে। সি এর নকশা উদ্দেশ্যগুলির মধ্যে একটি ছিল বিভিন্ন মেমরির আকার এবং কনফিগারেশনযুক্ত মেশিনগুলিতে ব্যবহারযোগ্য।

আমি মনে করি ডিজাইনের অভিপ্রায়টি মূলত ছিল যে প্রতিটি প্রকারের intমধ্যে ছোট ছোট জিনিস যা বিভিন্ন আকারের সংখ্যা পরিচালনা করতে পারে এবং intএটি সবচেয়ে কার্যকর "সাধারণ-উদ্দেশ্য" আকার যা +/- 32767 পরিচালনা করতে পারে। আমি মনে করি না যে এমন একটি ভাষা তৈরি করার কোনও ইচ্ছা বা উদ্দেশ্য ছিল যা কম্পিউটারগুলি এতটাই শক্তিশালী হয়ে উঠল যে এখনও ব্যবহারের মধ্যে থাকবে যে 64৪-বিট সংখ্যায় অপারেশনগুলির জন্য ছোট ছোটগুলিতে অপারেশন হিসাবে একই খরচ হয়।

সি এর পূর্ণসংখ্যার ধরণের শব্দার্থবিজ্ঞানের ক্ষেত্রে সবচেয়ে বড় সমস্যাটি হ'ল কিছু প্রসঙ্গে তারা মূল সংখ্যা বা গাণিতিক পূর্ণসংখ্যার প্রতিনিধিত্ব করে, অন্য প্রসঙ্গে প্রসঙ্গত সংমিশ্রণ মোড 2 ^ n এর মোড়ক বিমূর্ত বিজাতীয় রিংয়ের সদস্যদের প্রতিনিধিত্ব করতে ব্যবহৃত হয় [সুতরাং যেমন বিয়োগফল 0 থেকে সর্বাধিক উপস্থাপিত মান 1 টি প্রদানের জন্য সংজ্ঞায়িত করা হয়, তবে কম্পিউটার শব্দের আকারগুলি 16 বিটের কাছাকাছি হওয়ার সময় এবং কম্পাইলাররা যে দিনগুলিকে মনে করেছিল তার ভিত্তিতে আচরণগুলি আরও নির্দিষ্ট করা হয় (এবং একটি 36-বিট শব্দের আকার বিশাল হত ) পরিবর্তে 64৪-বিট মেশিনে কী বোঝাতে পারে তার ভিত্তিতে। ফলস্বরূপ, একটি 32 স্বল্প স্বাক্ষরিত 32-বিট মান থেকে 32-বিট স্বাক্ষরিত মানটি বিয়োগের ফলাফলটি হয় বড় 32-বিট স্বাক্ষরযুক্ত মান বা একটি নেতিবাচক 64৪-বিট সংখ্যা হতে পারে।


4

/programming/589575/size-of-int-long-etc

সুতরাং সর্বাধিক ব্যবহৃত আর্কিটেকচারে চরটি 1 বাইট, শর্ট এবং ইনট কমপক্ষে 2 বাইট এবং দীর্ঘতম কমপক্ষে 4 বাইট হয়।

এবং এটি অভিপ্রায় করা হয়েছে যে 'ইন্ট' বর্তমান সিপিইউর জন্য সবচেয়ে প্রাকৃতিক / স্বাভাবিক / দক্ষ প্রতিনিধিত্ব হওয়া উচিত।

সুতরাং সাধারণ নিয়মটি হ'ল 'ইনট' ব্যবহার করা হয় যদি না আপনার মানগুলি +/- 32K এর বেশি হয়, আপনাকে (পুরানো সিপিইউগুলিতে) 'দীর্ঘ' ব্যবহার না করে। ... অথবা আপনি ছোট (<32 কে) মানের বড় অ্যারে তৈরি না করে এবং মেমরিটি একটি সমস্যা - তাই আপনি মেমরি বাঁচাতে 'শর্ট' ব্যবহার করতে পারেন (বা সম্ভবত 'চর' বা 'বাইট')।


2
তবে -৪-বিট সহ, intখুব কমই কখনও পছন্দ করা যায়, তাই না? পোর্টিং কোড সহ সমস্যাগুলি এড়াতে আমি প্রায় সবসময়ই size_t(বা এমনকি ptrdiff_t!) ব্যবহার করে শেষ করি ।
user541686

@ মেরহাদাদ - এইচডাব্লু'র 'স্ট্যান্ডার্ড ইউনিট' এবং সাধারণত একটি পয়েন্টারের আকার হিসাবে সংজ্ঞায়িত করা সেরা পছন্দ হিসাবে ব্যবহৃত হয়েছিল। আজকাল সুরক্ষার জন্য সাইজ_টি ব্যবহার করুন।
মার্টিন বেকেট

1

সি বিভিন্ন স্তরে সক্রিয়ভাবে মেমরি নিয়ে কাজ করার জন্য ডিজাইন করা হয়েছিল। স্মৃতি সীমাবদ্ধতা, আর্কিটেকচার ইত্যাদির কারণে সংক্ষিপ্ত, আন্ত এবং দীর্ঘ এবং ভাসমান এবং দ্বিগুণের মধ্যে পার্থক্য রয়েছে এমন কিছু বিষয় রয়েছে যদিও এটি এখন কম গুরুত্বপূর্ণ হলেও এখনও এমন পরিবেশ রয়েছে যেখানে এটি রয়েছে (যেমন, এমবেড করা এবং এতে ডেটা প্রচুর পরিমাণে রয়েছে) এবং প্রধানত 32-বিট আর্কিটেকচার থেকে 64 বিটে রূপান্তর এটিকে আবার কিছুটা সমস্যার মধ্যে ফেলেছে। (দশ বা বিশ বছরে যখন আমরা 128 বিট আর্কিটেকচারে রূপান্তর করি এবং সি / সি ++ এখনও জনপ্রিয়, এটি আবার একটি বিষয় হয়ে উঠবে)। আপনি ঠিক আছেন যদিও বাইনারি সামঞ্জস্যতা ভুগছে, যে কারণে আপনি এই পরিবর্তনশীল প্রকারের মাপটি ব্যবহার করতে চান না কেন।

আপনি যদি জিজ্ঞাসা করেছিলেন যে আপনি যদি আকারটি না জানেন তবে কোনটি ব্যবহার করবেন তা আপনি জানেন তবে একটি নির্দিষ্ট আর্কিটেকচার / সংকলক সংমিশ্রণে আপনি আকারটি জানেন এবং আপনার যদি সেই স্তরে মেমরিটি অপ্টিমাইজ করার প্রয়োজন হয় তবে আপনি এটি আরও ভাল করে জানতে পারবেন। প্ল্যাটফর্মগুলি জুড়ে আপনি এটিকে অপ্টিমাইজ করতে পারবেন না কারণ আপনি তাদের আকারগুলি জানেন না, তাই আপনি সেই উদ্দেশ্যে এই বৈশিষ্ট্যগুলি ব্যবহার করতে চাইবেন না। তবে সি তে লিখিত প্রচুর জিনিস প্ল্যাটফর্ম-নির্দিষ্ট, যা "ক্রস প্ল্যাটফর্ম" এর ফ্যাশন সত্ত্বেও কিছু সুবিধাজনক অপ্টিমাইজেশনের অনুমতি দেয়।

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