C বা C++-এ পূর্ণসংখ্যা (integer) টাইপের ডেটার জন্য চারটি ভিন্ন ডেটা টাইপ রয়েছে: short, int, long এবং long long। প্রতিটি আলাদা মেমরি স্পেস ধারণ করে। আর্কিটেকচার, অপারেটিং সিস্টেম এবং কম্পাইলার অনুযায়ী আকার ভিন্ন হতে পারে। কখনো int ৪ বাইট নেয়, কখনো ২ বাইট। একইভাবে long-এর আকারও পরিবর্তনশীল। এই কারণে ক্রস কম্পাইলার ব্যবহার করা হয়।
ক্রস কম্পাইলার হলো এমন কম্পাইলার যা বর্তমান প্ল্যাটফর্ম ছাড়া অন্য প্ল্যাটফর্মের জন্য কোড কম্পাইল করতে সক্ষম।
নিচের কোড ৩২-বিট এবং ৬৪-বিট সিস্টেমে কম্পাইল করলে ভিন্ন আউটপুট দেবে।
উদাহরণ
#include <stdio.h>
int main() {
printf("Size of int : %ld Bytes\n", sizeof(int));
printf("Size of long : %ld Bytes\n", sizeof(long));
printf("Size of long long : %ld Bytes", sizeof(long long));
return 0;
}
আউটপুট (৩২-বিট)
Size of int : 4 Bytes Size of long : 4 Bytes Size of long long : 8 Bytes
আউটপুট (৬৪-বিট)
Size of int : 4 Bytes Size of long : 8 Bytes Size of long long : 8 Bytes
উপরের উদাহরণ থেকে বোঝা যায় long ডেটা টাইপের আকার কম্পাইলার ও আর্কিটেকচারভিত্তিক ভিন্ন। এর পেছনের কারণ কী?
CPU প্রাইমারি মেমরি (RAM) থেকে মেমরি অ্যাড্রেস রেজিস্টার (MAR) দিয়ে ঠিকানা দিয়ে ডেটা ডাকে। অবস্থান পাওয়ার পর সেটি মেমরি বাফার রেজিস্টার (MBR)-এ ট্রান্সফার হয়। ডেটা CPU রেজিস্টারে সংরক্ষিত হয়। ডেটা বাসের আকার CPU রেজিস্টারের আকার নির্ধারণ করে। ৩২-বিট সিস্টেমে একবারে ৪-বাইট ডেটা ডাকা যায়। ডেটা ৩২-বিটের চেয়ে বড় হলে দুই সাইকেল লাগে। ছোট ডেটার ক্ষেত্রে পার্থক্য নেই।