আপনি যেমন দেখিয়েছেন ঠিক তেমনটি করার জন্য আমি আপনাকে পরামর্শ দিচ্ছি, কারণ এটি সর্বাধিক সোজা ফরওয়ার্ড 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 প্রতিটি প্রকার এবং মেশিনের সাথে কাজ করবে।