সি প্রোগ্রামিং – ডেটা টাইপ এবং ভ্যারিয়েবল

এ অধ্যায়ে ব্যবহারিক প্রোগ্রাম থেকে বেশি আলোচনা হয়েছে সি প্রোগ্রামিং এর মৈলিক বিষয় গুলো নিয়ে। যে গুলো পরবর্তী অধ্যায় গুলোর কোড বুঝতে কাজে দিবে।

ভ্যারিয়েবল

এর আগের প্রোগ্রামে আমরা মাত্র এক লাইনের একটা আউটপুট দেখিয়েছি। যা শুধু মাত্র প্রোগ্রামিং শুরু করার জন্যই যথেষ্ট ছিল। বাস্তবে আমাদের জটিল কিছু প্রোগ্রাম লিখতে হবে। যার জন্য দরকার আমাদের ভ্যারিয়েবল এর ধারনা।

ভ্যারিয়েবল হচ্ছে একটি নাম, যা দিয়ে কম্পিউটারের মেমরিতে কোন ডেটা রাখা হয়। এ ডেটা হতে পারে নিউম্যারিক (যে কোন সংখ্যা) অথবা একটি character (a,b,c..Z)। এ ভ্যারিয়েবল এর মধ্যে কি ধরনের ডেটা রাখব আমরা তাই হচ্ছে ডেটা টাইপ।

ডেটা টাইপ

সি প্রোগ্রামিং এ অনেক প্রকারের ডাটা টাইপ আছে। তার মধ্য প্রধান চারটি হচ্ছেঃ

  • int data type
  • char data type
  • float data type
  • double data type

আরেকটা ডেটা টাইপ হচ্ছে void, যাকে ভ্যালুলেস ডেটা টাইপ বলে।

int data type

int data type বলতে integer quantity (অবিভাজ্য সংখা যেমনঃ ১, ২, ৩ ইত্যাদি) বুঝায়। এর সাইজ ২ বাইট বা ১৬ বিট (১বাইট=৮বিট) এবং রেঞ্জঃ -৩২৭৬৮ থেকে +৩২৭৬৭ পর্যন্ত।  কিছু কিছু কম্পাইলারে int ডেটার জন্য ৪ বাইট মেমরি দেয়। অর্থাৎ একটা int ডেটা টাইপের জন্য সর্বোচ্চ ৪ বাইট ডেটা রাখা যাবে। যার রেঞ্জ হচ্ছে  -2,147,483,648 থেকে 2,147,483,647।  এ রেঞ্জ এর মানে হচ্ছে এর থেকে বড় মানের সংখ্যা যদি আমরা কোন ইন্টিজার ডেটা টাইপ ভ্যারিয়েবলে সেট করি তাহলে কম্পাইলার সঠিক মান দিবে না। সাইজ এবং রেঞ্জ কম্পাইলার অনুযায়ী ভিন্ন হতে পারে।
int data type এর উদাহরন হিসেবে আমরা একটা প্রোগ্রাম দেখতে পারি। একটি আয়াতাকার  জমির দৈর্ঘ্য এবং প্রস্থ জানলে আমরা তার ক্ষেত্রফল বের করতে পারি। তাই না? মনে করে নিচ্ছি দৈর্ঘ্য ৫ একক এবং প্রস্থ ৮ একক। আমরা এর ক্ষেত্রফল হবে ৫*৮ = ৪০ একক। প্রোগ্রামে আমরা কিভাবে তা বের করতে পারি? নিচের প্রোগ্রামটি দেখি।

#include <stdio.h>
 
int main()
{
 int volume;
 int length = 5;
 int width = 8;
 volume = length * width;
 printf("%d", volume);
 return 0;
}
copy C Code & Paste it below the Compiler & Run

প্রোগ্রামটি রান করলে আমরা আউটপুট দেখতে পাবো 40

এটা আমাদের প্রথম প্রোগ্রাম থেকে দেখতে অনেক জটিল। এবং কিছুটা বড়। তবে অবশ্যই অনেক সহজ। কিছুক্ষণ আগে আমরা ভ্যারিয়বল সম্পর্কে জেনেছি।  এটি কম্পিউটার মেমরিতে কোন কিছু স্টোর বা সেভ করে রাখতে ব্যবহৃত হয়।
কিছুক্ষন আগে int নামে আমরা একটা ডেটা টাইপ সম্পর্কে জেনেছি। যা দিয়ে কম্পিউটারে Integer/ পূর্ণসংখ্যা কম্পিউটারে সংরক্ষন করা যায়। উপরের প্রোগ্রামে আমরা তিনটে ইন্টিজার ভ্যারিয়েবল ব্যবহার করেছি। প্রথম ভ্যারিয়েবল length বা দৈর্ঘ্য এর জন্য,  দ্বিতীয়টা width বা প্রস্থের জন্য। তৃতীয়টা নিয়েছি দৈর্ঘ্য এবং প্রস্থ থেকে আয়তন বের করে রাখার জন্য volume নামে।

আর এর সব টুকু লিখছি একটা লাইনের মধ্যে, যেমন int volume;  যাকে বলা হয় ভ্যারিয়েবল ডিক্লারেশন। অর্থাৎ একটা ভ্যারিয়েবল ব্যবহার করার আগে একে ডিক্লেয়ার করতে হয়। ডিক্লেয়ারেশন শেষ আমরা একটা সেমিকোলন দিয়েছি। একটি ভেরিয়েবল ডিক্লেয়ারেশন শেষে তা শেষ করার জন্য একটা সেমিকোলন ব্যবহার করতে হয়।  অর্থাৎ একটি ভ্যারিয়েবল ডিক্লেয়ার করতে হয় নিচের মত করেঃ

data_type variable_name;

কম্পিউটারকে তো আমাদের জানাতে হবে যে আমাদের জমির দৈর্ঘ্য এবং প্রস্থ কত, তাই না?  এর জন্য আমরা আরো দুটি ভ্যারিয়েবল নিয়েছি  length এবং width নামে। এ দুটি আবার int volume; থেকে একটু ভিন্ন। আমরা এ দুটি ভ্যারিয়েবল ডিক্লেয়ার করার সাথে সাথে একটি মান সেট করে দিয়েছি। যাকে বলে ভ্যালু এসাইন করা। মান সহ ভ্যারিয়েবল ডিক্লেয়ার করার নিয়ম হচ্ছেঃ

data_type variable_name = value;

এর পর বর্তীতে আমরা লিখছি volume = length * width; এর মানে হচ্ছে length ভ্যারিয়েবল এর মান এবং width ভ্যারিয়েবল এর মান গুন করে volume এ রাখা।

এর পরবর্তী লাইন এর সাথে আমরা কিছুটা পরিচিত।  printf(“%d”, volume); যা হচ্ছে printf() ফাংশন।

printf ফাংশন
printf() ফাংশন এর কাজ হচ্ছে কোন কিছু প্রিন্ট করা। একটা লেখা প্রিন্ট করার জন্য printf() এর ভেতর ডাবল কোটেশন এর মধ্যে কিছু লিখলেই তা প্রিন্ট করে দেয়, তা আমরা এর আগেই জেনে এসেছি।

কিন্তু এবার আমরা একটা ইন্টিজার ভ্যালু প্রিন্ট করব এবং একট ভ্যারিয়েবল এর থেকে। এর জন্য কিছু নিয়ম আমাদের ফলো করতে হবে। একটি ইন্টিজার প্রিন্ট করার জন্য printf() এর ভেতর ডাবল কোটেশন দিয়ে লিখতে হয় %d, এটিকে বলে placeholder। প্রত্যেকটি ডেটা টাইপের জন্য আলাধা আলাধা placeholders  রয়েছে। %d মানে হচ্ছে display integer। ডাবল কোটেশনের পর আমরা একটি কমা দিয়েছি। এর পর লিখছি আমাদের ইন্টিজার ভ্যারিয়েবলটি। যা আমাদের জমির ক্ষেত্রফল প্রিন্ট করে দিয়েছে।
ভালো হতো যদি প্রোগ্রামটা রান হওয়ার পর দৈর্ঘ্য এবং প্রস্থ নেওয়া যেত। তাহলে আমরা যে কোন জমির ক্ষেত্রফল বের করতে পারতাম। আমরা এমন কিছুই শিখব পরবর্তী অধ্যায় গুলতে।  এ অধ্যায় আমরা আরো কিছু মৌলিক ধারণা সম্পর্কে জানব।

প্লেসহোল্ডার / Placeholder

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

 ডেটা টাইপ প্লেসহোল্ডার
 int %d
 char %c
 float %f
 double %lf

character data type

char data type বলতে single character ( একটি বর্ন যেমন a, b, z, A, N ইত্যাদি) বুঝায়। এর সাইজ ১ বাইট বা ৮ বিট। বিট (১বাইট=৮বিট) এবং রেঞ্জঃ -১২৮ থেকে +১২৭ পর্যন্ত। আমাদের কীবোর্ডের প্রত্যেকটি চিহ্নই এক একটা  character। ক্যারেকটার ভ্যারিয়েবল ডিক্লেয়ার করার নিয়ম হচ্ছেঃ

char variable_name;

character ভ্যারিয়েবলে মাত্র একটি কারেকটার / লেটার / বর্ণ সংরক্ষন করা যায়। নিচের প্রোগ্রাম দেখিঃ

#include <stdio.h>
 
int main()
{
char ch = 'A';
printf("%c", ch);
return 0;
}
copy C Code & Paste it below the Compiler & Run

এখানে ch নামে একটা কারেকটার ভ্যারিয়েবল নিয়েছি। এরপর তা প্রিন্ট করেছি। ভ্যারিয়েবলের মধ্যে কোন কারেকটার এসাইন করার জন্য তা সিঙ্গেল কোটেশনের মধ্যে রাখতে হয়। এভাবে ‘A’।

ক্যারেক্টার ডেটা প্রিন্ট করার জন্য আমাদে %c প্লেসহোল্ডার ব্যবহার করতে হয়।

float data type:

integer ডেটা টাইপ শুধু মাত্র পূর্ণ সংখ্যা গুলো সংরক্ষন করা যায়। একটা integer ভ্যারিয়েবলে একটি দশমিক মান যেমনঃ ৮.৯ বা ইচ্ছে মত কিছু এসাইন করুন। এর পর ঐ ভ্যারিয়েবলটি প্রিন্ট করে দেখুন। কি দেখলেন? দশমিকের পরের অংশ নেই তাই না? নিচের প্রোগ্রামটা  আপনি  রান করিয়ে দেখতে পারেনঃ

#include <stdio.h>
 
int main()
{
 int n = 8.9;
 printf("%f", n);
 return 0;
}
copy C Code & Paste it below the Compiler & Run

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

float data type বলতে floating point number (দশমিক সংখা যেমনঃ ১০.৫, ১.৮, ৫.৬ ইত্যাদি) বুঝায়। floating point ডেটা টাইপ দশমিকের পর ৬ ঘর পর্যন্ত নির্ভুল ভাবে কোন নাম্বার সংরক্ষণ করতে পারে। উপরের প্রোগ্রামটার ভ্যারিয়েবল n এর Data Type পরিবর্তন করে float দিয়ে রান করিয়ে দেখোঃ

#include <stdio.h>
 
int main()
{
 float n = 8.9;
 printf("%f", n);
 return 0;
}
copy C Code & Paste it below the Compiler & Run

এটি এবার সঠিক মান দিবে। প্রিন্ট করার সময় আমাদের ফ্লোটিং পয়েন্ট ডেটা টাইপের প্লেসহোল্ডার %f ব্যবহার করতে হবে।

এবার আরেকটা উদাহরণ দেখি। আমরা জানি বৃত্তের ক্ষেত্রফলের জন্য দরকার এর ব্যাসার্ধের মান। কোন বৃত্তের ব্যাসার্ধ r হলে এর ক্ষেত্রফল  ধরে নিচ্ছি  বৃত্তের ব্যাসার্ধ 7.6 একক। আমরা এর ক্ষেত্রফল বের করার একটা প্রোগ্রাম লিখে ফেলিঃ

#include <stdio.h>
 
int main()
{
 float radius = 7.6;
 float area = (radius*radius * 3.1416);
 printf("%f", area);
 return 0;
}
copy C Code & Paste it below the Compiler & Run

আমরা radius নামে একটা floating point ভ্যারিয়েবল নিয়েছি। এর মধ্যে বৃত্তের ব্যাসার্ধ রেখেছি। area নামে আরেকটি ভ্যারিয়েবল নিয়েছি যার মধ্যে ক্ষেত্রফল বের করে রেখেছি।

আমরা যানি বৃত্তের ক্ষেত্রফল হচ্ছে ব্যাসার্ধ*ব্যাসার্ধ্য * পাই এর মান। তাই লিখছি এবং মানটি প্রিন্ট করেছি।

এর আগে integer এর উদাহরণে printf  ফাংশনে placeholder হিসেবে ব্যবহার করেছি %d, floating point এর জন্য placeholder হচ্ছে %f । বাকিটা তো সহজ তাই না?

আমরা জেনেছি যে floating point দশমিকের পর  ৬ ঘর পর্যন্ত নির্ভুল মান দিতে পারে। এর থেকে বেশি ঘর পর্যন্ত নির্ভুল মান পেতে হলে আমাদের আরেকটি ডেটা টাইপ ব্যবহার করতে হবে যার নাম হচ্ছে double ।

double data type

double data type বলতে Double precision floating point number বুঝায়।এটা float data type এর মতোই তবে সাইজ বিশাল। এর সাইজ ৮ বাইট বা ৬৪ বিট। এবং এটি দশমিকের পর ১৫ ঘর পর্যন্ত নির্ভুল মান সংরক্ষণ করতে পারে।

আমরা জানি বৃত্তের পরিধি ও ব্যাসের অনুপাতকে পাই/ Pi [Π]  দিয়ে প্রকাশ করা হয়। এটি একটি অমূলদ সংখ্যা। এটিকে দশমিক আকারে সম্পূর্ণ প্রকাশ করা সম্ভব নয়। দশমিকের পর অসীম সংখ্যা রয়েছে, এ জন্য। আমরা যদি float দিয়ে এর মান বের করার চেষ্টা করি, আমরা পাব দশমিকের পর ৬ ঘর পর্যন্ত। কিন্তু double দিয়ে যদি এর মান বের করি, তাহলে পাব দশমিকের পর ১৫ ঘর পর্যন্ত নির্ভুল মান। double এর মান প্রিন্ট বা আউটপুট পাবার জন্য প্লেসহোল্ডার হিসেবে আমাদের lf ব্যবহার করতে হয়।  নিচের প্রোগ্রামটি দেখিঃ

#include <stdio.h>
 
int main()
{
double pi = 3.14159265358979323846;
printf("%lf", pi);
return 0;
}
copy C Code & Paste it below the Compiler & Run

এখন যদিও কম্পাইল করে রান করার পর দশমিকের পর ৬ ঘরই দেখাবে। কিন্তু আমরা বলছি ১৫ ঘর পর্যন্ত নির্ভুল মান দিবে। ঠিকই বলেছি। এখন কম্পাইলারকে বলে দিতে হবে কত দশমিকের পর কত ঘর প্রিন্ট করবে। নিচের প্রোগ্রামটি দেখিঃ

#include <stdio.h>
 
int main()
{
double pi = 3.14159265358979323846;
printf("%.9lf", pi);
return 0;
}
copy C Code & Paste it below the Compiler & Run

এখানে আমরা প্লেসহোল্ডারে লিখেছি .9lf । প্লেসহোল্ডারে দশমিক দিয়ে কত ঘর পর্যন্ত প্রিন্ট করবে, তা বলে দিলে তত ঘর পর্যন্তই প্রিন্ট করবে। উপরের প্রোগ্রামটি এখন পাই এর মান দশমিকের পর ৯ ঘর পর্যন্ত প্রিন্ট করবে।

মাথায় দুষ্টু বুদ্ধি খেলা করে তাই না?  .9lf এর জায়গায় .50lf দিলে দশমিকের পর ৫০ ঘর প্রিন্ট করবে, তাই তো? হ্যা, ঠিকই  .50lf লিখলে ঠিকই দশমিকের পর ৫০ ঘর পর্যন্ত প্রিন্ট করবে। তবে তা আমরা যে রেজাল্ট চাচ্ছি তা পাবো না। ভুল কিছু পাবো। নিচের প্রোগ্রামটি দেখিঃ

#include <stdio.h>
 
int main()
{
double pi = 3.14159265358979323846;
printf("%.20f", pi);
return 0;
}
copy C Code & Paste it below the Compiler & Run

এখানে আমরা পাই এর মান দশমিকের পর ২০ঘর পর্যন্ত দিয়েছি। এরপর আমরা চাচ্ছি ২০ ঘর পর্যন্তই মান পেতে। তাই প্লেসহোল্ডারে .20f দিয়ে বলে দিয়েছি যেন দশমিকের পর ২০ ঘর পর্যন্ত প্রিন্ট করে। কিন্তু দশমিকের পর ১৫ ঘর পর্যন্ত ঠিক মানই প্রিন্ট করেছে। এরপর কত গুলো শূন্য দিয়ে পূরণ করে দিয়েছে। কারণ dobule ডেটা টাইপ দশমিকের পর ১৫ ঘর পর্যন্ত মান ঠিক মত মনে রাখতে পারে।

মডিফাইড ডেটা টাইপ

উপরের এ চারটি ডেটা টাইপকে মডিফাই করে আরো অনেক গুলো ডেটা টাইপ তৈরি করা যায়। মডিফাই করার জন্য নিচের মডিফায়ার গুলো ব্যবহার করা হয়ঃ

  • signed
  • unsigned
  • long
  • short

যেমন int ডেটা টাইপের অন্যান্য ভার্শন হচ্ছেঃ

  • signed int
  • unsigned int
  • long int
  • short int
  • long long int etc

ডেটা টাইপ এবং তাদের রেঞ্জ

শুরুতে আমরা রেঞ্জ নিয়ে কিছু পড়েছি, হয়তো ঠিক মত বুঝতে পারি নি। কিন্তু এবার আমরা বিস্তারিত জানব। আমরা বলেছি int data type এর সাইজ হচ্ছে ২ বাইট। আমরা জানি এক বাইট সমান ৮ বিট। তাহলে দুই বাইট সমান ১৬ বিট। আর এই ১৬ বিটের মানে হচ্ছে কম্পিউটার (216 -1) =  (65536 -1) = 65535 পর্যন্ত নির্ভুল ভাবে সেভ করতে পারবে। মানে আমরা সুন্দর ভাবেই 0-65535 পর্যন্ত যে কোন নাম্বার একটি ইন্টিজারে সেভ করতে পারব। এখন যদি আমরা এর থেকে বড় কোন মান যেমন 65538 ইন্টিজার ডেটা টাইপে সেভ করি, কম্পাইলার ঠিক মত মান আমাদের আউটপুট দিতে পারবে না। উলটা প্লাটা একটা ভ্যালু দিবে।

আমরা বলেছি যে কিছু কিছু কম্পাইলার ইন্টিজারের জন্য ৪ বাইট মেমরি বরাদ্ধ করে। ৪ বাইট মানে হচ্ছে ৪*৮ বিট। = ৩২ বিট। আর ৩২ বিট মানে আমরা (232 -1) = (4294967296 -১) = 4294967295 পর্যন্ত নির্ভুল মান সেভ করতে পারব ইন্টিজার ডেটা টাইপ হিসেবে। এর থেকে বড় কোন মান যদি ইন্টিজার হিসেবে সেভ করতে চাই, তাহলে ঠিক মত আউটপুট পাবো না। যেটা পাবো সেটা দারুণ। দারুণ কেন বলছি। আগে 4294967295 এর থেকে বড় যে কোন একটা সংখ্যা ইন্টিজার ভ্যারিয়েবল হিসেবে প্রিন্ট করে দেখি। যেমন 6294967295

#include <stdio.h>
 
int main()
{
 int n = 6294967295;
 printf("%d", n);
 return 0;
}
copy C Code & Paste it below the Compiler & Run

কি আউটপুট পাচ্ছি? আমি পাচ্ছি 1999999999…  যেটা পাওয়ার কথা সেটা পাই নি। কারণ ইন্টিজার ডেটাটাইপে যতটুকু ক্ষমতা তার থেকে বড় মান আমরা সেভ করার চেষ্টা করেছি, তাই।

4294967295 এর পরবর্তি সংখ্যা 4294967296, এটা প্রিন্ট করে দেখিঃ

#include <stdio.h>
 
int main()
{
 int n = 4294967296;
 printf("%d", n);
 return 0;
}
copy C Code & Paste it below the Compiler & Run

আউটপুট পাচ্ছি শূন্য। ০ ।

4294967297 প্রিন্ট করে দেখলে পাবো 1।

#include <stdio.h>
 
int main()
{
int n = 4294967297;
printf("%d", n);
return 0;
}
copy C Code & Paste it below the Compiler & Run

এভাবে যদি 4294967298 প্রিন্ট করি, তাহলে পাবো ২। মানে কি দাড়ালো? মানে 4294967295 এর পরের সংখ্যা গুলো প্রিন্ট করার চেষ্টা করলে আবার ০ থেকে প্রিন্ট করা শুরু করে। সুন্দর একটা কারণ আছে। কারণটা কি? চিন্তা করে বের করতে পার।

এতক্ষণ আমরা Unsigned ইন্টিজার সম্পর্কে আলোচনা করেছি। Unsigned মানে হচ্ছে সংখ্যাটা কি ধণাত্ত্বক নাকি ঋণাত্ত্বক, তা বলে দেই নি। কিন্তু মাঝে মাঝে আমাদের Singed Integer নিয়ে কাজ করতে হবে। মানে আমরা ভ্যারিয়েবল ডিক্লারেশনের সময় বলে দিব সংখ্যাটা কি ধনাত্ত্বক নাকি ঋণাত্ত্বক, তখন আবার রেঞ্জ ছোট হয়ে যাবে। তখন একটি ইন্টিজারের রেঞ্জ হয়ে যাবে -2,147,483,648 থেকে +2,147,483,647 পর্যন্ত। মানে আমরা  -2,147,483,648 পর্যন্ত এবং 2,147,483,647 পর্যন্ত ইন্টিজার মান একটা ইন্টিজার ভ্যারিয়েবলে সেভ করতে পারব।
ধণাত্ত্বক হলে কম্পাইলার আউটপুটে + চিহ্ন প্রিন্ট করবে না। কিন্তু ঋণাত্ত্বক হলে তা দেখাবেঃ

#include <stdio.h>
 
int main()
{
int n = -899;
printf("%d", n);
return 0;
}
copy C Code & Paste it below the Compiler & Run

উপরে একটি ধণাত্ত্বক সংখ্যা আমরা বলতে পারি  Singed Integer ভ্যারিয়েবল তৈরি করা হয়েছে। এবং পরে তা প্রিন্ট করা হয়েছে।

নিচে ভিন্ন ভিন্ন ডেটা টাইপ এবং তাদের সাইজ দেওয়া হলোঃ

 ডেটা টাইপ সাইজ
 int 2 bytes
 char 1 byte
 float 4 bytes
 double 8 bytes

বিদ্রঃ এটি কম্পাইলার ভেদে ভিন্ন হতে পারে।

মডিফাইড ডেটা টাইপ এবং তাদের সাইজ এবং রেঞ্জ।

টাইপবিট সাইজ রেঞ্জ
char8-127 থেকে 127
unsigned chart80 থেকে 255
Signed char8-27 থেকে 127
int16 or 32-32,767 থেকে 32,767
Unsigned int16 or 320 থেকে 65,535
Signed int16 or 32-32,767 থেকে 32,767
Short int16-32,767 থেকে 32,767
Unsigned short int160 থেকে 65,535
Signed short int16-32,767 থেকে 32,767
Long int32-2,147,483,647 থেকে 2,147,483,647
Long long int64-(263 – 1) থেকে (263 – 1)
Signed long int32-2,147,483,647 থেকে 2,147,483,647
Unsigned long int320 থেকে 4,294,967,295
Unsigned long long int640 থেকে (264 – 1)
float321.2E-38 to 3.4E+38
double642.3E-308 to 1.7E+308
Long double803.4E-4932 to 1.1E+4932

#include <stdio.h>
#include <limits.h>
#include <float.h>
#include <stdbool.h> // For boolean type

// Define byte as an alias for unsigned char (8 bits)
typedef unsigned char byte;

int main() {
    // Initialize variables with their maximum values
    byte b = UCHAR_MAX;                 // 8 bits (unsigned char)
    _Bool boolean = true;               // 8 bits (boolean)
    char c = CHAR_MAX;                  // 8 bits (signed char)
    unsigned char uc = UCHAR_MAX;       // 8 bits (unsigned char)
    signed char sc = SCHAR_MAX;         // 8 bits (signed char)
 
    int i = INT_MAX;                    // 32 bits (int)
    unsigned int ui = UINT_MAX;         // 32 bits (unsigned int)
 
    short int si16 = SHRT_MAX;          // 16 bits (short int)
    unsigned short int usi16 = USHRT_MAX; // 16 bits (unsigned short int)
 
    long int li = LONG_MAX;             // 32 or 64 bits (long int)
    long long int lli = LLONG_MAX;      // 64 bits (long long int)
 
    signed long int sli = LONG_MAX;     // 32 or 64 bits (signed long int)
    unsigned long int uli = ULONG_MAX;  // 32 or 64 bits (unsigned long int)
    unsigned long long int ulli = ULLONG_MAX; // 64 bits (unsigned long long int)
 
    float f = FLT_MAX;                  // 32 bits (float)
    double d = DBL_MAX;                 // 64 bits (double)
    long double ld = LDBL_MAX;          // 80 or 128 bits (long double)
 
    // Print values
    printf("byte: %u\n", b);                // %u for unsigned
    printf("boolean: %d\n", boolean);       // %d for boolean (1 or 0)
    printf("char: %d\n", c);                // %d for signed char
    printf("unsigned char: %u\n", uc);      // %u for unsigned char
    printf("signed char: %d\n", sc);        // %d for signed char
 
    printf("int: %d\n", i);                 // %d for int
    printf("unsigned int: %u\n", ui);       // %u for unsigned int
 
    printf("short int: %d\n", si16);        // %d for short int
    printf("unsigned short int: %u\n", usi16); // %u for unsigned short int
 
    printf("long int: %ld\n", li);          // %ld for long int
    printf("long long int: %lld\n", lli);   // %lld for long long int
 
    printf("signed long int: %ld\n", sli);  // %ld for signed long int
    printf("unsigned long int: %lu\n", uli); // %lu for unsigned long int
    printf("unsigned long long int: %llu\n", ulli); // %llu for unsigned long long int
 
    printf("float: %.2e\n", f);             // %.2e for float
    printf("double: %.2e\n", d);            // %.2e for double
    printf("long double: %.2Le\n", ld);    // %.2Le for long double
 
    return 0;
}

Constant বা ধ্রুবক

সি প্রোগ্রামিং এ চার ধরনের কনস্ট্যান্ট বা ধ্রুবক রয়েছে। integer constant, floating-point constant, character constant & string constant.

আমরা ইতিমধ্যে এসব ব্যবহার করেছি। ইন্টিজার কনস্ট্যান্ট হচ্ছে যে কোন ইন্টিজার নাম্বার। যেমন 12, 5, 102 ইত্যাদি যে কোন সংখ্যা।

গণিতে যেমন আমরা একটা বড় সংখ্যাকে পড়ার সুবিধার্থে এর মধ্যে কমা ব্যবহার করি, সি প্রোগ্রামিং এ আমরা তা করতে পারব না। যেমন আমরা দশ হাজারকে এভাবে লিখতে পারব নাঃ 10,000 ।

যে কোন দশমিক সংখ্যাই হচ্ছে ফ্লোটিং পয়েন্ট কনস্ট্যান্ট। যেমন 5.2, 9.666, 0.145 ইত্যাদি।

ক্যারেক্টার কনস্ট্যান্ট হচ্ছে একটি সিঙ্গেল ক্যারেকটার। যেমনঃ ‘A’, ‘X’, ‘g’ ইত্যাদি।

ক্যারেক্টার কন্সট্যান্ট লিখি আমরা সিঙ্গেল কোটেশনের মধ্যে। আর মাত্র একটি ক্যারেক্টার থাকে। ডাবল কোটেশনের মধ্যে এক বা একের অধিক ক্যারেকটার লিখলে তাকে আমরা সি প্রোগ্রামিং এ বলি স্ট্রিং কন্সট্যান্ট। যেমনঃ “Hello”, “Bangladesh is a land of stories”, “5.5698” ইত্যাদি। ডাবল কোটেশনে কোন নাম্বার রাখলে তা আর নাম্বার থাকে না, তা স্ট্রিং হয়ে যায়।

Escape Sequence

আমরা একটা প্যারাগ্রাফ প্রিন্ট করতে চাচ্ছি। প্যারাগ্রাফ গুলোতে কয়েকটা বাক্যের মাঝে মাঝে নতুন লাইন থাকে। এর আগে আমরা printf এর ভেতর একটা লেখা দিয়েছি, তা প্রিন্ট করে দিয়েছে। যেমন আপনি আপনার নাম, বাবার নাম প্রিন্ট করতে চাইলে  কি করবেন? কেমন বিশ্রি দেখাবে না যদি দুইটাই একই লাইনে থাকে? একটা প্রোগ্রাম লিখে ফেলুন যেখানে আপনার নাম আর আপনার বাবার নাম প্রিন্ট করবে। যদি দুই জনের নামের মধ্যে একটা নতুন লাইন দিতে পারতেন, দারুণ হত না?

সি প্রোগ্রামিং এ নতুন লাইন বা Life Feed দেওয়ার জন্য আমাদের \n ব্যবহার করতে হয়। ব্যাকস্ল্যাশ এবং n এক সাথে। এখানে n এর আগে একটা ব্যাকস্ল্যাশ ব্যবহার করার কারণে n এর কাজ পরিবর্তণ হয়েছে। এমন অনেক গুলো কারেক্টার সিকোয়েন্স রয়েছে। এদের বলা হয় Escape Sequence।  নিচে একটি প্রোগ্রাম লেখা হলো নিউ লাইন সহঃ

#include <stdio.h>
 
main()
{
printf("The creator of C Programming Language is Danich Ritchie. \n Danich Ritchie also co developer of Unix");
 
 return 0;
}
copy C Code & Paste it below the Compiler & Run

\n এর মত আরো অনেক গুলো এস্কেইপ সিকোয়েন্স রয়েছে। নিচে তাদের একটি তালিকা দেওয়া হলোঃ

এস্কেইপ সিকোয়েন্সকাজ।
\aAlert (Beep, Bell) (added in C89)
\bBackspace
\fFormfeed
\nNewline (Line Feed); see notes below
\rCarriage Return
\tHorizontal Tab
\vVertical Tab
\\Backslash
\’Single quotation mark
\”Double quotation mark