কেন কেবল 2 বাইট হয়?


9

অন্যান্য প্ল্যাটফর্মগুলিতে সি / সি ++ ব্যবহার করার সময়, intপ্রকারটি সাধারণত 4 বাইট (বা সম্ভবত আরও বেশি) হয়। তবে, আরডুইনোতে এটি মাত্র 2 বাইট।

এটা আলাদা কেন? আমি যদি এর longপরিবর্তে সর্বদা 4 বাইট ব্যবহার করি তবে এটি কী কর্মক্ষমতাকে প্রভাবিত করে?


2
নোটটি যে intআর্দুইনো বকেলে 4 বাইট একটি shortসমস্ত বিদ্যমান Ardunios 2 বাইট হতে হবে, কিন্তু আমি ব্যবহার অন্যদের পরামর্শ জোর দেওয়া int16_tবা uint16_t
রন

উত্তর:


10

প্রচুর আরডুইনোসে ব্যবহৃত এটিমেগ 328 হ'ল 8-বিটের মাইক্রোকন্ট্রোলার। এর অর্থ হ'ল নিবন্ধগুলি 8-বিট, ডেটা বাস 8-বিট, বন্দরগুলি 8-বিট। সিস্টেমে কয়েকটি ন্যূনতম 16-বিট দিক রয়েছে (যেমন টাইমারগুলির মধ্যে একটি), তবে প্রায় সবকিছুই 8-বিট।

অতএব, বেশিরভাগ অপারেশনগুলি একসাথে 8-বিট পরিচালনা করে। 8-বিট (16-বিট বা 32-বিট ইন্টিজার এবং ফ্লোটিং পয়েন্ট সংখ্যা) ব্যতীত অন্য কোনও কিছুর জন্য কাজ করাতে সফ্টওয়্যার এমুলেশন হিসাবে প্রয়োজনীয়ত কী বর্ণনা করা যেতে পারে, যেখানে সংকলক এই বৃহত্তর ভেরিয়েবলগুলিতে কাজ করতে একাধিক নির্দেশনা ব্যবহার করে।

8-বিট 8 বিট পোর্টকে সম্বোধন করার জন্য স্পষ্টতই যথেষ্ট। অনেক লুপ কাউন্টার, রিটার্ন মান এবং ASCII অক্ষরগুলি মোকাবেলা করার জন্য এটি যথেষ্ট। সংখ্যার সাথে কাজ করার সময় এটি যথেষ্ট পর্যাপ্ত নয়। একটি স্বাক্ষরিত 8-বিট ইন্ট (int8_t) কেবল -128 -> +127 উপস্থাপন করতে পারে। স্বাক্ষরযুক্ত (uint8_t) কেবল 0 -> 255 উপস্থাপন করতে পারে।

8-বিট পূর্ণসংখ্যা বেশ সীমাবদ্ধ। সি / সি ++ ইন্টের অন্ততপক্ষে -32,678 -> +32,767 প্রতিনিধিত্ব করতে হবে তাই 16 -t মানচিত্র - এটি ক্ষুদ্রতম আকার যা এটি করবে। এটি পরিসীমা এবং দক্ষতার একটি ভাল ভারসাম্য দেয়। প্রাথমিকভাবে যখন শিখতে হয় তখন এটি বিশেষত গুরুত্বপূর্ণ - ওভারফ্লো সত্যিই এমন কিছু নয় যা নন-প্রোগ্রামাররা বোঝে।

এটি করার একটি কার্যকারিতা প্রভাব রয়েছে, কারণ বেশিরভাগ 16-বিট অপারেশনগুলি 8-বিট অপারেশন হিসাবে কমপক্ষে দ্বিগুণ দীর্ঘ সময় নেয় এবং দ্বিগুণ রেজিস্টার ব্যবহার করে। এটি আপনার পক্ষে কোনও তাত্পর্যপূর্ণ হতে পারে বা নাও পারে।

আমাদের মধ্যে অনেকে নেটিভ টাইপ যেমন int8_t এবং uint8_t এ স্যুইচ করে যা এটি আপনাকে আরও বেশি নিয়ন্ত্রণ দেয়।


3
কেবল একটি নোট: এটি আর্দুইনো টিম নয় যা int16_t তে ম্যাপিং করেছে, "ইনট" একটি সি / সি ++ সংরক্ষিত কীওয়ার্ড এবং ম্যাপিং টাইপটি এবিআইয়ের অংশ ( gcc.gnu.org/wiki/avr-gcc ) যে avr-gcc সংকলকের বিকাশকারীরা অনুসরণ করার সিদ্ধান্ত নিয়েছে। আর একটি উল্লেখযোগ্য পার্থক্য হ'ল "ডাবল" প্রকারের মধ্যে যা সাধারণত
bit৪ বিবিট

ধন্যবাদ। আমি কেন লিখলাম তা নিশ্চিত নয়। আমি জানি অবধি অবশ্যই 32,678 -> +32,767 উপস্থাপন করতে হবে (যদিও, আসলে আমি মনে করি এনইসি প্রসেসরের যে কোনও এটির অনুসরণ করে নি তার মালিকানা সংকলক ছিল)। আমি মনে করি এটি এম্বেড থাকা সিস্টেমে প্রস্থগুলি লুকানো পছন্দ করে না - int16_t ব্যবহার করা আরও পরিষ্কার।
সাইবারিবিবোনস 20:25

1
পরিষ্কার দেশি ধরণের ব্যবহারের জন্য +1! আরডুইনো বকেয়াতে, একটি int32-বিট! arduino.cc/en/References/int
রন

3

সি এবং সি ++ ভাষা সম্পর্কে একটি গুরুত্বপূর্ণ তথ্য হ'ল তাদের নিজ নিজ মানগুলি ইন্টিগ্রাল এবং ভাসমান পয়েন্ট নম্বর ধরণের আকার (বাইটে) সংজ্ঞায়িত করে না।

তারা কেবলমাত্র এই ব্যাপ্তির মধ্যে ন্যূনতম ব্যাপ্তি এবং সম্পর্ককে সংজ্ঞায়িত করে

range(short) <= range(int) < range(long)

সুতরাং যেমন একটি আকার intসাধারণত উপর নির্ভর করবে:

  • লক্ষ্য প্ল্যাটফর্ম (প্রসেসর)
  • সংকলক নিজেই

আপনি কি বলছেন sizeof(short) == sizeof(int) == sizeof(long)সম্ভব?
রন

@ রন-ই তাত্ত্বিকভাবে, হ্যাঁ, এটি সম্ভব হবে। বাস্তবে, তবে আমি এটি কখনও দেখিনি। বেশিরভাগ সংকলক / প্ল্যাটফর্মে, কেউ আশা করতে পারে (যদিও এটি আরোপিত নয়) sizeof(short) < sizeof(long)
jfpoil ব্যাখ্যা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.