স্বাক্ষরযুক্ত এবং স্বাক্ষরবিহীন int এর মধ্যে পার্থক্য কী


91

স্বাক্ষরিত এবং স্বাক্ষরবিহীন int এর মধ্যে পার্থক্য কী?


4
এটি একটি আসল প্রশ্ন এবং উত্তরটি এত সহজ নয় বরং সূক্ষ্ম।
আর .. গীটহাব বন্ধ করুন ICE

পুনরায় খুলতে ভোট। এটি একটি সদৃশ হতে পারে তবে এটি অবশ্যই একটি বাস্তব প্রশ্ন।
ব্রায়ান


আরও বেশি ট্যাগ যুক্ত করা উচিত, যেহেতু অনেকগুলি ভাষা সেগুলি ব্যবহার করে।
জুয়ান বোয়েরো

এই প্রশ্নের বিস্তৃত করার জন্য একটি অধ্যায় প্রয়োজন হতে পারে। যদি আপনি ইন এবং আউটগুলি জানতে চান তবে আরও ব্যাখ্যার জন্য স্বাক্ষরবিহীন এবং স্বাক্ষরিত পূর্ণসংখ্যাগুলি দেখুন।
বেনামে

উত্তর:


113

আপনি সম্ভবত সচেতন, 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এই বিটটি "সাইন বিট" হিসাবে পরিচিত।


11
সম্ভবত উল্লেখ করার মতো এটি হ'ল এটিই এই দুটির পরিপূরক বিন্যাস, যা আজকাল বহুলভাবে ব্যবহৃত হয়। স্বাক্ষরিত পূর্ণসংখ্যার উপস্থাপনের অন্যান্য উপায়ও রয়েছে, বিশেষত এর পরিপূরক।
শিডিউল

সঠিক। এবং ISO9899 সি স্ট্যান্ডার্ড এমনকি এমনকি একটির পরিপূরক বা দুটি এর পরিপূরক ব্যবহার করা প্রয়োজন হয় না; অন্য যে কোনও কনভেনশন আসলে কাজ করে তা অনুমোদিত
মেরিপোসা

4
যদিও দু'টির পরিপূরক প্রয়োজন হয় না, (unsigned)(-1)তার unsigned(বাইনারি উপস্থাপনার থেকে পৃথক) জন্য সর্বাধিক প্রতিনিধিত্বমূলক মান হওয়া আবশ্যক , যা 2 এর পরিপূরকের জন্য তুচ্ছ সত্য, তবে অন্যান্য উপস্থাপনা নয়।
রুবেনভবি

4
@ বিলএভানস্যাটমারিপোসা: স্ট্যান্ডার্ডটি বলেছে যে স্বাক্ষরিত পূর্ণসংখ্যার জন্য 3 টি অনুমোদিত প্রতিনিধিত্ব রয়েছে: সাইন + মাত্রা, 2 এর পরিপূরক, 1 এর পরিপূরক। অন্য যে কোনও প্রোগ্রামের জন্য অদৃশ্য হতে হবে এবং এগুলির মধ্যে একটি হিসাবে অনুভূত হবে
আলেক্সি ফ্রুঞ্জ

ঠিক আছে তবে হুডের নিচে! আসলেই কি হচ্ছে! একটি স্বাক্ষরিত এবং UNSIGNED সংখ্যার মধ্যে পার্থক্য কী! যন্ত্রটি কীভাবে গণনা পরিচালনা করে? এটি কেবল অন্যের থেকে একটি মান বিয়োগ করে? 1111 = 15 এবং 1111 = -1 এর মধ্যে কীভাবে পার্থক্য রয়েছে?
মিহাইল জর্জেস্কু

19

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))


12

কখনও কখনও আমরা আগে থেকেই জানি যে প্রদত্ত পূর্ণসংখ্যের ভেরিয়েবলে সঞ্চিত মান সর্বদা ইতিবাচক হবে - যখন এটি কেবল জিনিস গণনা করার জন্য ব্যবহৃত হয়। এই জাতীয় ক্ষেত্রে আমরা ভেরিয়েবলটিকে স্বাক্ষরবিহীন হিসাবে ঘোষণা করতে পারি, যেমন unsigned int num student;,। এই জাতীয় ঘোষণার মাধ্যমে, অনুমোদনযোগ্য পূর্ণসংখ্যার মানগুলির (32-বিট সংকলকের জন্য) পরিসীমা -2147483648 থেকে +2147483647 পরিসীমা 0 থেকে 4294967295-এ স্থানান্তরিত হবে। সুতরাং, স্বাক্ষরহীন হিসাবে পূর্ণসংখ্যার ঘোষণা করা সবচেয়ে বড় আকারের দ্বিগুণ হয়ে যায় এটি অন্যথায় ধরে রাখতে পারে যে মান।


@ অ্যালেক্স আমি সম্পাদনা করার মাঝামাঝি ছিলাম যে উত্তর 10 মিনিট আগে এবং এটি অভিন্ন। lol
স্কুলড

12

সাধারণ ব্যক্তির ভাষায় একটি স্বাক্ষরবিহীন ইন্ট একটি পূর্ণসংখ্যা যা thatণাত্মক হতে পারে না এবং এটি ইতিবাচক মানগুলির উচ্চতর পরিসীমা ধারণ করে যা এটি ধরে নিতে পারে। একটি স্বাক্ষরিত ইন্ট হ'ল একটি পূর্ণসংখ্যা যা নেতিবাচক হতে পারে তবে এটি ধরে নিতে পারে এমন আরও নেতিবাচক মানগুলির বিনিময়ে কম ইতিবাচক পরিসর রয়েছে।


0

অনুশীলনে, দুটি পার্থক্য রয়েছে:

  1. মুদ্রণ (যেমন coutসি ++ বা printfসি এর সাথে): স্বাক্ষরবিহীন পূর্ণসংখ্যা বিট উপস্থাপনা মুদ্রণ ফাংশন দ্বারা একটি nonnegative পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করা হয়।
  2. ক্রম : ক্রম স্বাক্ষরিত বা স্বাক্ষরযুক্ত স্বনির্ধারণের উপর নির্ভর করে।

এই কোডটি অর্ডারিং মানদণ্ড ব্যবহার করে পূর্ণসংখ্যা সনাক্ত করতে পারে:

char a = 0;
a--;
if (0 < a)
    printf("unsigned");
else
    printf("signed");

এটি যদি নেতিবাচক সংখ্যার সাথে সম্পর্কিত অন্যটির সাথে আলাদাভাবে ব্যাখ্যা করা হয় তবে তা নয়। এটি এই পোস্টে অনেক সাহায্য করবে।
ড্যানিয়েল জ্যাকসন

@ ড্যানিয়েল জ্যাকসন আপনি কী বলছেন তা পরিষ্কার নয়। সংকলকের উপর নির্ভর করে একটি চরকে নেতিবাচক বা ধনাত্মক হিসাবে বিবেচনা করা যেতে পারে। কোডের আউটপুট নির্ভর করে যা সংকলকটি চয়ন করে তার উপর নির্ভর করে এবং এটি স্বাক্ষরিত এবং স্বাক্ষরবিহীন এর মধ্যে পার্থক্য দেখায়।
মিনিমাস হেক্সিমাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.