স্বাক্ষরিত এবং স্বাক্ষরবিহীন int এর মধ্যে পার্থক্য কী?
স্বাক্ষরিত এবং স্বাক্ষরবিহীন int এর মধ্যে পার্থক্য কী?
উত্তর:
আপনি সম্ভবত সচেতন, int
গুলি বাইনারি মধ্যে অভ্যন্তরীণভাবে সংরক্ষণ করা হয়। সাধারণত int
একটিতে 32 বিট থাকে তবে কিছু পরিবেশে 16 বা 64 বিট থাকতে পারে (বা এমনকি একটি আলাদা সংখ্যাও সাধারণত তবে দুটো শক্তিই নয়)।
তবে এই উদাহরণের জন্য, আসুন 4-বিট পূর্ণসংখ্যাটি দেখুন। ক্ষুদ্র, তবে উদাহরণের জন্য দরকারী।
যেহেতু এই জাতীয় পূর্ণসংখ্যায় চারটি বিট থাকে তাই এটি 16 টির মধ্যে একটির মান ধরে নিতে পারে; ১ দুই থেকে চতুর্থ শক্তির, বা ২ বার ২ বার ২ বার ২ বার those এই মানগুলি কী? উত্তরটি নির্ভর করে যে এই পূর্ণসংখ্যাটি একটি signed int
বা একটি unsigned int
। একটি সঙ্গে unsigned int
, মান কখনও নেতিবাচক হয় না; মানটির সাথে সম্পর্কিত কোনও চিহ্ন নেই। এখানে একটি ফোর-বিটের 16 টি সম্ভাব্য মান রয়েছে unsigned int
:
bits value
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 10
1011 11
1100 12
1101 13
1110 14
1111 15
... এবং এখানে একটি চার-বিটের 16 টি সম্ভাব্য মান রয়েছে signed int
:
bits value
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 -8
1001 -7
1010 -6
1011 -5
1100 -4
1101 -3
1110 -2
1111 -1
আপনি দেখতে পাচ্ছেন যে, signed int
এর জন্য সবচেয়ে উল্লেখযোগ্য বিটটি হল 1
এবং যদি কেবল সংখ্যাটি নেতিবাচক হয়। সে কারণেই, signed int
এই বিটটি "সাইন বিট" হিসাবে পরিচিত।
(unsigned)(-1)
তার unsigned
(বাইনারি উপস্থাপনার থেকে পৃথক) জন্য সর্বাধিক প্রতিনিধিত্বমূলক মান হওয়া আবশ্যক , যা 2 এর পরিপূরকের জন্য তুচ্ছ সত্য, তবে অন্যান্য উপস্থাপনা নয়।
int
এবং unsigned int
দুটি স্বতন্ত্র পূর্ণসংখ্যার প্রকার। ( int
এছাড়াও হিসাবে উল্লেখ করা যেতে পারে signed int
, বা ন্যায়সঙ্গত signed
; unsigned int
এছাড়াও হিসাবে উল্লেখ করা যেতে পারে unsigned
।)
নামগুলি বোঝায় যে int
এটি একটি স্বাক্ষরিত পূর্ণসংখ্যার প্রকার এবং unsigned int
এটি একটি স্বাক্ষরবিহীন পূর্ণসংখ্যার প্রকার। এর অর্থ int
হ'ল নেতিবাচক মানগুলি উপস্থাপন করতে সক্ষম এবং unsigned int
এটি কেবল অ-নেতিবাচক মানগুলি উপস্থাপন করতে পারে।
সি ভাষা এই ধরণের সীমার মধ্যে কিছু প্রয়োজনীয়তা আরোপ করে। পরিসীমা int
অন্তত হতে হবে -32767
.. +32767
এবং পরিসীমা unsigned int
অন্তত হতে হবে 0
.. 65535
। এটি বোঝায় যে উভয় প্রকারের কমপক্ষে 16 বিট থাকতে হবে। এগুলি অনেকগুলি সিস্টেমে 32 বিট বা কিছুতে 64 বিট। int
বেশিরভাগ আধুনিক সিস্টেমে ব্যবহৃত দুটির পরিপূরক প্রতিনিধিত্বের কারণে সাধারণত একটি অতিরিক্ত নেতিবাচক মান থাকে।
সম্ভবত সর্বাধিক গুরুত্বপূর্ণ পার্থক্য হ'ল স্বাক্ষরিত বনাম। স্বাক্ষরবিহীন গাণিতিকের আচরণ। স্বাক্ষরিত হওয়ার জন্য int
, ওভারফ্লোতে আচরণের সংজ্ঞা দেওয়া হয়নি। কারণ unsigned int
, সেখানে কোনও ওভারফ্লো নেই; যে কোনও অপারেশন যা প্রকারের মোড়কের বাইরে একটি মান দেয়, উদাহরণস্বরূপ UINT_MAX + 1U == 0U
।
যে কোনও পূর্ণসংখ্যার প্রকার, স্বাক্ষরিত বা স্বাক্ষরবিহীন, গাণিতিক পূর্ণসংখ্যার অসীম সেটটির উপস্থাপিত করে। যতক্ষণ আপনি কোনও ধরণের সীমার মধ্যে মানগুলির সাথে কাজ করছেন ততক্ষণ সবকিছু কাজ করে। আপনি যখন কোনও প্রকারের নীচের বা উপরের সীমার কাছে যান, তখন আপনি একটি বিরতির মুখোমুখি হন এবং আপনি অপ্রত্যাশিত ফলাফল পেতে পারেন। স্বাক্ষরিত পূর্ণসংখ্যার ধরণের ক্ষেত্রে, সমস্যাগুলি কেবলমাত্র খুব বড় নেতিবাচক এবং ধনাত্মক মানের জন্যই ঘটে, ছাড়িয়ে যায় INT_MIN
এবং INT_MAX
। স্বাক্ষরবিহীন পূর্ণসংখ্যার ধরণের ক্ষেত্রে, সমস্যাগুলি খুব বড় ধনাত্মক মানগুলির জন্য এবং শূন্যে ঘটে । এটি বাগের উত্স হতে পারে। উদাহরণস্বরূপ, এটি একটি অসীম লুপ:
for (unsigned int i = 10; i >= 0; i --) [
printf("%u\n", i);
}
কারণ i
হল সবসময় চেয়ে শূন্যের চেয়ে বড় বা সমান; এটি স্বাক্ষরযুক্ত প্রকারের প্রকৃতি। (লুপের অভ্যন্তরে, যখন i
শূন্য হয়, i--
এর মান সেট করে UINT_MAX
))
কখনও কখনও আমরা আগে থেকেই জানি যে প্রদত্ত পূর্ণসংখ্যের ভেরিয়েবলে সঞ্চিত মান সর্বদা ইতিবাচক হবে - যখন এটি কেবল জিনিস গণনা করার জন্য ব্যবহৃত হয়। এই জাতীয় ক্ষেত্রে আমরা ভেরিয়েবলটিকে স্বাক্ষরবিহীন হিসাবে ঘোষণা করতে পারি, যেমন unsigned int num student;
,। এই জাতীয় ঘোষণার মাধ্যমে, অনুমোদনযোগ্য পূর্ণসংখ্যার মানগুলির (32-বিট সংকলকের জন্য) পরিসীমা -2147483648 থেকে +2147483647 পরিসীমা 0 থেকে 4294967295-এ স্থানান্তরিত হবে। সুতরাং, স্বাক্ষরহীন হিসাবে পূর্ণসংখ্যার ঘোষণা করা সবচেয়ে বড় আকারের দ্বিগুণ হয়ে যায় এটি অন্যথায় ধরে রাখতে পারে যে মান।
সাধারণ ব্যক্তির ভাষায় একটি স্বাক্ষরবিহীন ইন্ট একটি পূর্ণসংখ্যা যা thatণাত্মক হতে পারে না এবং এটি ইতিবাচক মানগুলির উচ্চতর পরিসীমা ধারণ করে যা এটি ধরে নিতে পারে। একটি স্বাক্ষরিত ইন্ট হ'ল একটি পূর্ণসংখ্যা যা নেতিবাচক হতে পারে তবে এটি ধরে নিতে পারে এমন আরও নেতিবাচক মানগুলির বিনিময়ে কম ইতিবাচক পরিসর রয়েছে।
অনুশীলনে, দুটি পার্থক্য রয়েছে:
cout
সি ++ বা printf
সি এর সাথে): স্বাক্ষরবিহীন পূর্ণসংখ্যা বিট উপস্থাপনা মুদ্রণ ফাংশন দ্বারা একটি nonnegative পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করা হয়।এই কোডটি অর্ডারিং মানদণ্ড ব্যবহার করে পূর্ণসংখ্যা সনাক্ত করতে পারে:
char a = 0;
a--;
if (0 < a)
printf("unsigned");
else
printf("signed");