c - what is data type




সাইজের আকার "int" 2 বাইট বা 4 বাইট? (9)

সি একটি পূর্ণসংখ্যা পরিবর্তনশীল 2 বাইট বা 4 বাইট দখল? এটা নির্ভর করে যে কারণ কি?

বেশিরভাগ পাঠ্যপুস্তক বলেছে পূর্ণসংখ্যা ভেরিয়েবল 2 বাইট দখল করে। কিন্তু যখন আমি একটি প্রোগ্রাম প্রিন্টিং পূর্ণসংখ্যা একটি অ্যারের ধারাবাহিক ঠিকানা মুদ্রণ এটি 4 এর পার্থক্য দেখায়।


সাইজের আকার "int" 2 বাইট বা 4 বাইট?

উত্তর হল "হ্যাঁ" / "না" / "হয়তো" / "হয়তো না"।

সি প্রোগ্রামিং ভাষাটি নিচের CHAR_BIT উল্লেখ করে: char সর্বাধিক অ্যাড্রেসযোগ্য ইউনিট, যা char দ্বারা পরিচিত এবং "বাইট" নামেও পরিচিত, ঠিক CHAR_BIT বিট প্রশস্ত, যেখানে CHAR_BIT কমপক্ষে 8 হয়।

সুতরাং, সি-তে একটি বাইট অবশ্যই একটি অক্টেট নয় , অর্থাৎ 8 বিট। সি কোড (এবং ইউনিক্স) চালানোর প্রথম প্ল্যাটফর্মগুলির মধ্যে একটিতে 4-বাইট int ছিল কিন্তু মোট int 36 বিট ছিল, কারণ CHAR_BIT 9 ছিল!

int প্ল্যাটফর্মের জন্য প্রাকৃতিক পূর্ণসংখ্যা আকার বলে মনে করা হয় যা কমপক্ষে -32767 ... 32767 পরিসর। আপনি sizeof(int) সহ প্ল্যাটফর্ম বাইটগুলিতে int এর আকার পেতে পারেন; যখন আপনি CHAR_BIT দ্বারা এই মানটিকে CHAR_BIT তখন আপনি CHAR_BIT কতটা প্রশস্ত তা জানতে পারবেন।

যদিও 36-বিট মেশিন বেশিরভাগই মৃত, এখনও 8-বিট বাইটের প্ল্যাটফর্ম রয়েছে। মাত্র গতকাল টেক্সাস ইনস্ট্রুমেন্টস এমসিইউ সম্পর্কে 16-বিট বাইট সহ একটি প্রশ্ন ছিল, যার একটি C99, C11-compliant কম্পাইলার রয়েছে।

TMS320C28x মনে হয় যে char , short এবং int সমস্ত 16 বিট প্রশস্ত, এবং সেইজন্য একটি বাইট। long int 2 বাইট এবং long long int হয় 4 বাইট। C এর সৌন্দর্য হল যে কেউ এইরকম একটি প্ল্যাটফর্মের জন্য কার্যকরী প্রোগ্রামটি লিখতে পারে এবং এমনকি একটি পোর্টেবল পদ্ধতিতেও এটি করতে পারে!


সাইজের আকার "int" 2 বাইট বা 4 বাইট?

সি একটি পূর্ণসংখ্যা পরিবর্তনশীল 2 বাইট বা 4 বাইট দখল?

সি "বাইট" প্রতি "বিট" প্রতি 8 বিট ছাড়া অন্য কিছু করার অনুমতি দেয়।

CHAR_BIT ছোট বস্তুর জন্য বিট সংখ্যা যা একটি বিট-ক্ষেত্র নয় (বাইট) C11dr §5.2.4.2.1 1

8 এর চেয়ে কিছু একটি মান ক্রমবর্ধমান অস্বাভাবিক। সর্বাধিক পোর্টেবিলিটির জন্য, 8 এর পরিবর্তে CHAR_BIT ব্যবহার করুন। CHAR_BIT বিটগুলির একটি int আকারের আকার sizeof(int) * CHAR_BIT

#include <limits.h>
printf("(int) Bit size %zu\n", sizeof(int) * CHAR_BIT);

এটা নির্ভর করে যে কারণ কি?

int বিট আকার সাধারণত 32 বা 16 বিট হয়। সি নির্দিষ্ট ন্যূনতম পরিসর :

অন্তর INT_MIN 32767 টাইপের একটি বস্তুর জন্য ন্যূনতম মান
int INT_MAX +32767 টাইপের একটি বস্তুর সর্বোচ্চ মান
C11dr §5.2.4.2.1 1

int জন্য ন্যূনতম পরিসীমা বিট আকারটি অন্তত 16 হতে পারে - এমনকি যদি প্রসেসরটি "8-বিট" ছিল। বিশেষ প্রসেসরগুলিতে 64 বিট মত একটি আকার দেখা যায়। 18, 24, 36 ইত্যাদি অন্যান্য মূল্যায়নের ঐতিহাসিক প্ল্যাটফর্মগুলিতে ঘটেছে বা অন্ততঃ তাত্ত্বিকভাবে সম্ভব। আধুনিক কোডিং খুব কমই অ শক্তি-এর-2 int বিট মাপ সম্পর্কে উদ্বেগ।

কম্পিউটারের প্রসেসর এবং আর্কিটেকচারটি int বিট সাইজ নির্বাচন চালায়।

তবুও 64-বিট প্রসেসরগুলির সাথে, কম্পাইলারের int আকারটি 32-বিট সামঞ্জস্যের কারণে হতে পারে কারণ বৃহত কোড বুনিয়াদগুলি 32-বিট (বা 32/16) int নির্ভর করে।


আমি এটা sizeof(int) সমান জানি। একটি int আকার সত্যিই কম্পাইলার নির্ভরশীল। ফিরে দিন, যখন প্রসেসর 16 বিট, একটি int ছিল 2 বাইট। আজকাল, এটি প্রায় 32 বাইটের পাশাপাশি 64-বিট সিস্টেমে 4 বাইট।

এখনও, sizeof(int) ব্যবহার করে নির্দিষ্ট সিস্টেমে প্রোগ্রামটি কার্যকর করার জন্য পূর্ণসংখ্যার আকার পেতে সর্বোত্তম উপায়।

সম্পাদনা করুন: বেশিরভাগ 64-বিট সিস্টেমে int ভুল স্থির বিবৃতি যা 8 বাইট হয়। উদাহরণস্বরূপ, এটি 64-বিট জি সি সি তে 4 বাইট।


এই প্রশ্নের উত্তর আপনি কোন প্ল্যাটফর্ম ব্যবহার করছেন তার উপর নির্ভর করে।
কিন্তু প্ল্যাটফর্ম নির্বিশেষে, আপনি নির্ভরযোগ্যভাবে নিম্নলিখিত ধরনের অনুমান করতে পারেন:

 [8-bit] signed char: -127 to 127
 [8-bit] unsigned char: 0 to 255
 [16-bit]signed short: -32767 to 32767
 [16-bit]unsigned short: 0 to 65535
 [32-bit]signed long: -2147483647 to 2147483647
 [32-bit]unsigned long: 0 to 4294967295
 [64-bit]signed long long: -9223372036854775807 to 9223372036854775807
 [64-bit]unsigned long long: 0 to 18446744073709551615

এটি সি-তে পয়েন্টগুলির মধ্যে একটি যা প্রথমে বিভ্রান্তিকর হতে পারে, তবে C মানটি কেবলমাত্র পূর্ণসংখ্যাগুলির জন্য ন্যূনতম পরিসর নির্দিষ্ট করে যা সমর্থিত হওয়ার নিশ্চয়তা দেয়। int 32767 থেকে 32767 রাখা সক্ষম হওয়ার জন্য নিশ্চিত, যা 16 বিট প্রয়োজন। যে ক্ষেত্রে, int , 2 বাইট হয়। যাইহোক, বাস্তবায়নগুলি সর্বনিম্নের বাইরে যেতে মুক্ত, যেমন আপনি দেখতে পাবেন যে অনেকগুলি আধুনিক কম্পাইলারগুলি 32-বিট int (যা 4 বিটগুলি সর্বজনীনভাবেও বহন করে) বোঝায়।

কারণ আপনার বই বলে যে 2 বাইট সম্ভবত এটি পুরানো কারণ। এক সময়, এই আদর্শ ছিল। সাধারণভাবে, আপনি sizeof অপারেটার ব্যবহার করতে পারেন যদি আপনি যে প্ল্যাটফর্মটি ব্যবহার করছেন তার জন্য এটি কতগুলি বাইট খুঁজে বের করতে হবে।

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


কোন নির্দিষ্ট উত্তর নেই। এটা প্ল্যাটফর্ম উপর নির্ভর করে। এটি বাস্তবায়ন-সংজ্ঞায়িত। এটা 2, 4 বা অন্য কিছু হতে পারে।

int পিছনে ধারণাটি দেওয়া হয়েছে যে এটি দেওয়া প্ল্যাটফর্মের প্রাকৃতিক "শব্দ" আকারের সাথে মিলিত হওয়া উচিত: 16-বিট প্ল্যাটফর্মগুলিতে 16 বিট, 32-বিট প্ল্যাটফর্মগুলিতে 32 বিট, 64-বিট প্ল্যাটফর্মগুলিতে 64 বিট, আপনি ধারণাটি পান । যাইহোক, পিছনে সামঞ্জস্যের উদ্দেশ্যে কিছু কম্পাইলার 64-বিট প্ল্যাটফর্মগুলিতে এমনকি 32-বিট int থাকতে পছন্দ করে।

২-বাইট int সময় দীর্ঘ চলে গেছে (16-বিট প্ল্যাটফর্ম?) যদি না আপনি 16-বিট শব্দ আকার সহ কিছু এমবেডেড প্ল্যাটফর্ম ব্যবহার করেন। আপনার পাঠ্যপুস্তক সম্ভবত খুব পুরানো।


বেশিরভাগ এটি আপনি যে প্ল্যাটফর্মটি ব্যবহার করছেন তার উপর নির্ভর করে। এটি কম্পাইলার থেকে কম্পাইলারের উপর নির্ভর করে। আজকাল কম্পাইলারগুলি int অধিকাংশে 4 বাইটের । আপনি যদি আপনার কম্পাইলারটি কী ব্যবহার করছেন তা পরীক্ষা করতে চান তবে আপনি sizeof(int) ব্যবহার করতে পারেন।

main()
{
    printf("%d",sizeof(int));
    printf("%d",sizeof(short));
    printf("%d",sizeof(long));
}

একমাত্র সি কম্পাইলার প্রতিশ্রুতিটি যে ছোট আকারটি int এর চেয়ে সমান বা কম হওয়া উচিত এবং দীর্ঘ আকারটি int এর চেয়ে সমান বা বেশি হতে হবে। সুতরাং যদি int এর আকার 4 হয় তবে ছোট আকারের আকার 2 বা 4 হতে পারে তবে বড় নয় তার চেয়েও বেশি। এটি বলে যে ছোট এবং দীর্ঘ আকার একই হতে পারে না।


এই প্রশ্নের উত্তর দেওয়ার জন্য এটি একটি ভাল উৎস।

কিন্তু এই প্রশ্নটি সবসময় একটি ধরনের সত্যই উত্তর দেয় "হ্যাঁ।"

এটা আপনার স্থাপত্য উপর নির্ভর করে। যদি আপনি 16-বিট মেশিনে কম বা কম কাজ করতে যাচ্ছেন তবে এটি 4 বাইট (= 32 বিট) হতে পারে না। আপনি যদি 32-বিট বা ভাল মেশিনে কাজ করেন তবে এর দৈর্ঘ্য 32-বিট।

চিন্তা করার জন্য, আপনি কিছু পাঠযোগ্য আউটপুট আউটপুট প্রস্তুত এবং "sizeof" ফাংশন ব্যবহার করুন। এটি আপনার ঘোষিত ডেটাটাইপের বাইটগুলিতে আকার প্রদান করে। কিন্তু অ্যারে সঙ্গে এই ব্যবহার করে carfull হতে।

যদি আপনি int t[12]; ঘোষণা করছেন int t[12]; এটা 12 * 4 বাইট ফিরে আসবে। এই অ্যারের দৈর্ঘ্য পেতে, sizeof(t)/sizeof(t[0]) । যদি আপনি একটি ফাংশন তৈরি করতে যাচ্ছেন, এটি একটি প্রেরণ অ্যারের আকার গণনা করা উচিত, মনে রাখবেন যে যদি

typedef int array[12];
int function(array t){
    int size_of_t = sizeof(t)/sizeof(t[0]);
    return size_of_t;
}
void main(){
    array t = {1,1,1};  //remember: t= [1,1,1,0,...,0]
    int a = function(t);    //remember: sending t is just a pointer and equal to int* t
   print(a);   // output will be 1, since t will be interpreted as an int itselve. 
}

তাই এই এমনকি কিছু ভিন্ন ফিরে না। আপনি একটি অ্যারে সংজ্ঞায়িত এবং পরে দৈর্ঘ্য পেতে চেষ্টা করুন, sizeof ব্যবহার করুন। যদি আপনি একটি ফাংশনে একটি অ্যারে পাঠান, তবে মনে রাখবেন প্রেরণ মান শুধুমাত্র প্রথম উপাদানটির একটি পয়েন্টার। কিন্তু এক ক্ষেত্রে, আপনি সর্বদা জানেন, আপনার অ্যারে কি আকার। কেস দুটি দুটি ফাংশন সংজ্ঞায়িত করে এবং কিছু কর্মক্ষমতা মিস্ করে figured আউট করা যেতে পারে। ফাংশন নির্ধারণ করুন (অ্যারে টি) এবং function2 সংজ্ঞায়িত (অ্যারে টি, int size_of_t)। কল করুন "ফাংশন (টি)" কিছু অনুলিপি দ্বারা দৈর্ঘ্য পরিমাপ করুন এবং ফলাফলটি ফাংশন 2 এ পাঠান, যেখানে আপনি পরিবর্তনশীল অ্যারে-মাপগুলিতে যা চান তা করতে পারেন।


#include <stdio.h>

int main(void) {
    printf("size of int: %d", (int)sizeof(int));
    return 0;
}

এই 4 ফেরৎ, কিন্তু সম্ভবত এটি মেশিন নির্ভরশীল।





byte