আপনি যেমন দেখিয়েছেন ঠিক তেমনটি করার জন্য আমি আপনাকে পরামর্শ দিচ্ছি, কারণ এটি সর্বাধিক সোজা ফরওয়ার্ড forward প্রকৃত সাইন প্রতিনিধির চেয়ে স্বতন্ত্র, -1
যা সর্বদা কাজ করবে তা সূচনা করুন , আবার ~
কখনও কখনও অবাক করার মতো আচরণও করতে হবে কারণ আপনার সঠিক অপারেন্ড টাইপ থাকতে হবে। তবেই আপনি কোনও unsigned
ধরণের সর্বাধিক উচ্চ মান পাবেন ।
সম্ভাব্য বিস্ময়ের উদাহরণ হিসাবে, এটি বিবেচনা করুন:
unsigned long a = ~0u;
এটি অগত্যা সমস্ত বিট 1 এর সাথে কোনও প্যাটার্ন সংরক্ষণ করবে না a
। তবে এটি প্রথমে একটিতে সমস্ত বিট 1 দিয়ে একটি প্যাটার্ন তৈরি করবে unsigned int
এবং তারপরে এটি নির্ধারণ করবে a
। যখন unsigned long
আরও বিট থাকে তখন যা হয় তা হ'ল সবগুলি 1 হয় না।
এবং এটিকে বিবেচনা করুন, যা নন-টুয়ের পরিপূরক উপস্থাপনায় ব্যর্থ হবে:
unsigned int a = ~0; // Should have done ~0u !
তার কারণ হ'ল ~0
সমস্ত বিট উল্টাতে হবে। উল্টানো যা -1
দু'জনের পরিপূরক মেশিনে আসবে (যা আমাদের প্রয়োজন মান!) তবে অন্য উপস্থাপনের ফল পাবেন না-1
। কারও পরিপূরক মেশিনে এটি শূন্যের ফলন দেয়। সুতরাং, কারও পরিপূরক মেশিনে উপরেরটি a
শূন্যে শুরু হবে ।
আপনার যে জিনিসটি বুঝতে হবে তা হ'ল এটি সমস্ত মান - বিট নয়। ভেরিয়েবলটি একটি মান দিয়ে শুরু করা হয় । ইনিশিয়ালাইজারে আপনি যদি আরম্ভের জন্য ব্যবহৃত ভেরিয়েবলের বিটগুলি সংশোধন করেন তবে মানগুলি সেই বিট অনুসারে উত্পন্ন হবে। মান আপনার যা দরকার আরম্ভ করতে, a
, সম্ভাব্য সর্বোচ্চ মান হয় -1
বা UINT_MAX
। দ্বিতীয়টি নির্ভর করবে এর ধরণের উপর a
- আপনার ULONG_MAX
একটি ব্যবহারের প্রয়োজন হবে unsigned long
। তবে প্রথমটি তার ধরণের উপর নির্ভর করবে না এবং এটি সর্বাধিক সর্বোচ্চ মান পাওয়ার একটি দুর্দান্ত উপায়।
আমরা সব বিট আছে কিনা তা নিয়ে কথা বলছি না -1
(এটি সবসময় হয় না)। এবং আমরা সব বিট আছে কিনা তা নিয়ে কথা বলছি না ~0
(এটি অবশ্যই আছে)।
তবে আমরা যে বিষয়ে কথা বলছি তা হ'ল প্রাথমিক flags
ভেরিয়েবলের ফলাফল । এবং এটির জন্য, কেবল-1
প্রতিটি প্রকার এবং মেশিনের সাথে কাজ করবে।