ইন্টের সর্বাধিক মান


177

Integer.MaxValueজাভাতে ফাংশনের মতো সি / সি ++ তে পূর্ণসংখ্যার সর্বোচ্চ মান (সংকলক অনুসারে) সন্ধানের জন্য কি কোনও কোড রয়েছে ?


1
দীর্ঘ দীর্ঘ ইন্টের সর্বাধিক মান খুঁজে পাওয়ার কোনও উপায় কি ??
d3vdpro

শুধু প্রতিস্থাপন intসঙ্গে long long intGregories উত্তরে ...
গেয়র্গ Fritzsche

1
দীর্ঘ দীর্ঘ ব্যতীত সি ++ এর অংশ নয়


@ নীল, ঠিক আছে, এর সি 99 - তবে ভিসি এবং জিসিসি (ছাড়াই -pedantic) এটি সমর্থন করে।
জর্জি ফ্রিত্শে

উত্তর:


323

সি ++ এ:

#include <limits>

তারপরে ব্যবহার করুন

int imin = std::numeric_limits<int>::min(); // minimum value
int imax = std::numeric_limits<int>::max();

std::numeric_limits এটি একটি টেম্পলেট প্রকার যা অন্য ধরণের সাথে ইনস্ট্যান্ট করা যায়:

float fmin = std::numeric_limits<float>::min(); // minimum positive value
float fmax = std::numeric_limits<float>::max();

সি তে:

#include <limits.h>

তারপরে ব্যবহার করুন

int imin = INT_MIN; // minimum value
int imax = INT_MAX;

অথবা

#include <float.h>

float fmin = FLT_MIN;  // minimum positive value
double dmin = DBL_MIN; // minimum positive value

float fmax = FLT_MAX;
double dmax = DBL_MAX;

13
নোট করুন যে ভাসমান-পয়েন্টটি minসর্বনিম্ন ধনাত্মক মান, যেখানে পূর্ণসংখ্যা হিসাবে minসর্বনিম্ন মান হয়। সি ম্যাক্রো / ধ্রুবকগুলির জন্য একই।
ডাল

4
C99 এ আপনি UINT64_MAX এবং INT64_MAX
দিমিত্রি ভিয়াল

3
@ দিমিত্রিওয়াল: হ্যাঁ আপনি পারবেন তবে সেগুলি সীমাবদ্ধতা uint64_tএবং int64_tনয় int
কিথ থম্পসন

সি ++ এ, আমি উপরে প্রদর্শিত একই কোড ব্যবহার করেছি: #include <limits>এবং int imax = std::numeric_limits<int>::max();, তবে আমি ত্রুটি পেয়েছি Can't resolve struct member 'max'। এটি কেন ঘটে এবং এটিকে কীভাবে ঠিক করা যায় সে সম্পর্কে কোনও ধারণা? আমি উবুন্টু 14.04 এ সিএমকে এবং সি ++ 11 সহ ক্লিওন আইডিই ব্যবহার করছি। আমি মনে করি এটি এই ইস্যুতে
লিঙ্কযুক্ত

1
আশা করি এটি কাউকে সাহায্য করবে, কারণ এটি একটি ক্লায়োন আইডিই বাগ ছিল যা আমি সর্বশেষ ক্লিওন ব্যবহার করে স্থির করেছি (138.2344 তৈরি করুন - ক্লিওন প্রাথমিক অ্যাক্সেস প্রোগ্রামের পর্যায়ে রয়েছে এবং এইভাবে অস্থির)
মডুলিটস

30

আমি জানি এটি একটি পুরানো প্রশ্ন তবে সম্ভবত কেউ এই সমাধানটি ব্যবহার করতে পারেন:

int size = 0; // Fill all bits with zero (0)
size = ~size; // Negate all bits, thus all bits are set to one (1)

এখন পর্যন্ত আমাদের কাছে ফলাফল হিসাবে 1 রয়েছে ' আকারটি একটি স্বাক্ষরিত ইনট হয়।

size = (unsigned int)size >> 1; // Shift the bits of size one position to the right.

যেমন স্ট্যান্ডার্ড বলেছেন, বিটগুলি স্থানান্তরিত হয় যদি ভেরিয়েবল স্বাক্ষরিত হয় এবং negativeণাত্মক হয় এবং 0 হলে ভেরিয়েবল স্বাক্ষরযুক্ত বা স্বাক্ষরিত হয় এবং ইতিবাচক হয়।

হিসাবে আকার সাইন করা হয়েছে এবং ঋণাত্মক আমরা 0 সাইন বিট যা 1, যা অনেক সাহায্য করা হয় না হয় নামান হবে, তাই আমরা স্বাক্ষরবিহীন int- এ নিক্ষেপ, পরিবর্তে 0 নামান করতে বাধ্য, সাইন বিট সেট লেট যখন সব অন্যান্য বিট 1 থাকা।

cout << size << endl; // Prints out size which is now set to maximum positive value.

আমরা একটি মাস্ক এবং জোরও ব্যবহার করতে পারি তবে তারপরে আমাদের ভেরিয়েবলের সঠিক বিটসাইজটি জানতে হবে। বিটস সামনের দিকে স্থানান্তরিত করার সাথে, আমাদের মেশিন বা সংকলকটিতে কতগুলি বিট রয়েছে বা আমাদের অতিরিক্ত লাইব্রেরি অন্তর্ভুক্ত করার দরকার নেই তা জানতে হবে না।


1
cout << "INT_MAX:\t" << (int) ((~((unsigned int) 0)) >> 1) << '\n' << "UINT_MAX:\t" << ~((unsigned int) 0) << endl;
স্লেয়ার

15
#include <climits>
#include <iostream>
using namespace std;

int main() {
  cout << INT_MAX << endl;
}

1
আমি INT_MAX কে "সি এর সমাধান" বলব না। যদিও এটি পুরানো-স্কুল এবং সি ++ এ অবনতি হয়েছে।
পল টমলিন

6
আমি মনে করি উভয়ই সি ++ উত্তর। numeric_limits<int>::max()- টেমপ্লেট প্রসঙ্গেও কাজ করে, তবে (আমার কাছে কিছু অকাট্য কারণে) একটি সংকলন-সময় ধ্রুবক হিসাবে ব্যবহার করা যায় না। INT_MAX- এটি একটি ম্যাক্রো, টেম্পলেট ফাংশনগুলির মধ্যে বেশ অযোগ্য, তবে একটি সংকলন-সময় ধ্রুবক হিসাবে ব্যবহার করা যেতে পারে।
আঙ্কেলবেন্স

17
মজার বিষয় হ'ল সংখ্যাসূচক_মিলিট <int> :: এমএসভিসি-তে সর্বাধিক বাস্তবায়ন এইরকম দেখাচ্ছে: রিটার্ন (INT_MAX);
নিকোলা স্মিলজানিć

13
অনুগ্রহ করে @ পল রেফারেন্স দয়া করে। এবং অনুমান করুন কীভাবে সংখ্যাসূচক_মুক্তি সর্বাধিক () প্রয়োগ করে? ঠিক আছে, কমপক্ষে জিসিসি ৪.৪.০ এ "INT_MAX" ফিরিয়ে দিন।

2
@ ইউনসলবেন্স: ইনলাইন ফাংশনগুলি বর্তমানে ধ্রুবক অভিব্যক্তিগুলিতে হ্রাস করা যায় না।
জর্জি ফ্রিত্শে

1

স্বাক্ষরিত পূর্ণসংখ্যার সর্বাধিক মান পেতে আমি যে ম্যাক্রোটি ব্যবহার করি তা এখানে ব্যবহৃত স্বাক্ষরিত পূর্ণসংখ্যার আকারের চেয়ে পৃথক এবং যার জন্য জিসিসি -ওয়েজফ্লো অভিযোগ করবে না

#define SIGNED_MAX(x) (~(-1 << (sizeof(x) * 8 - 1)))

int a = SIGNED_MAX(a);
long b = SIGNED_MAX(b);
char c = SIGNED_MAX(c); /* if char is signed for this target */
short d = SIGNED_MAX(d);
long long e = SIGNED_MAX(e);

1

কোডের একটি অংশ কেন লিখবেন না:

int  max_neg = ~(1 << 31);
int  all_ones = -1;
int max_pos = all_ones & max_neg;

28
আকারের 32 বিট হওয়ার কোনও গ্যারান্টি নেই এবং মেমরি নেগেটিভ পূর্ণসংখ্যার বিন্যাস সম্পর্কে কোনও গ্যারান্টি নেই। কম গুরুত্বপূর্ণ, লোকদের '~' দেখাতে কোনও প্রয়োজন নেই।
স্কাইকি

0

ঠিক আছে আমি তন্ন তন্ন (ফিলিপ ডি Muyter এর) পূর্ববর্তী উত্তরে মন্তব্যের প্রতিনিধির আছে কিংবা তার ব্যবহার করে এটি এর স্কোর, অত একটি নতুন দৃষ্টান্ত বাড়াতে সংজ্ঞায়িত SIGNED_MAX জাভাস্ক্রিপ্টে গার্বেজ স্বাক্ষরবিহীন ধরনের জন্য বাড়ানো জন্য:

// We can use it to define limits based on actual compiler built-in types also: 
#define INT_MAX   SIGNED_MAX(int)
// based on the above, we can extend it for unsigned types also:
#define UNSIGNED_MAX(x) (  (SIGNED_MAX(x)<<1) | 1 ) // We reuse SIGNED_MAX
#define UINT_MAX  UNSIGNED_MAX(unsigned int) // on ARM: 4294967295
// then we can have:
unsigned int width = UINT_MAX;

এটি বা সেই শিরোলেখ ব্যবহারের বিপরীতে, আমরা এখানে কম্পাইলার থেকে প্রকৃত প্রকারটি ব্যবহার করি।


0
#include <iostrema>

int main(){
    int32_t maxSigned = -1U >> 1;
    cout << maxSigned << '\n';
    return 0;
}

এটি আর্কিটেকচার নির্ভর হতে পারে তবে এটি আমার সেটআপে অন্তত কাজ করে।


-1

Int এর সুনির্দিষ্ট সর্বাধিক মানের জন্য , আমি সাধারণত হেক্সাডেসিমাল স্বরলিপিটি লিখি:

int my_max_int = 0x7fffffff;

অনিয়মিত দশমিক মান পরিবর্তে:

int my_max_int = 2147483647;

-1

কি সম্পর্কে (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))। এই হিসাবে একই 2^(8*sizeof(int)-2) - 1 + 2^(8*sizeof(int)-2)

যদি sizeof(int) = 4 => 2^(8*4-2) - 1 + 2^(8*4-2) = 2^30 - 1 + 20^30 = (2^32)/2 - 1 [max signed int of 4 bytes]

আপনি ব্যবহার করতে পারবেন না 2*(1 << (8*sizeof(int)-2)) - 1কারণ এটি উপচে পড়বে, তবে (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))কাজ করে।

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