Чи є якийсь код, щоб знайти максимальне значення цілого числа (відповідно до компілятора) в C / C ++ як Integer.MaxValue
функція в java?
int
з long long int
в Gregories відповідь ...
-pedantic
) підтримують його.
Чи є якийсь код, щоб знайти максимальне значення цілого числа (відповідно до компілятора) в C / C ++ як Integer.MaxValue
функція в java?
int
з long long int
в Gregories відповідь ...
-pedantic
) підтримують його.
Відповіді:
В C ++:
#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;
min
- це мінімальне додатне значення, де як ціле число min
є мінімальне значення. Те саме стосується і макросів / констант C.
uint64_t
та int64_t
, а не int
.
#include <limits>
і int imax = std::numeric_limits<int>::max();
, але я отримую помилку Can't resolve struct member 'max'
. Будь-які ідеї, чому це відбувається, і як це виправити? Я використовую CLion IDE, з CMake та C ++ 11 на Ubuntu 14.04. Я думаю, що це пов'язано з цим питанням
Я знаю, що це старе питання, але, можливо, хтось може скористатися цим рішенням:
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.
Як говорить Стандарт, біти, які зміщені, - 1, якщо змінна підписана і негативна, і 0, якщо змінна буде непідписаною або підписаною та позитивною.
Оскільки розмір підписаний і негативний, ми змістимо біт знаків, який дорівнює 1, що не дуже допомагає, тому ми переходимо до непідписаного int, змушуючи замість нього зміщувати 0, встановлюючи біт знака 0, а всі інші біти залишаються 1.
cout << size << endl; // Prints out size which is now set to maximum positive value.
Ми також могли використовувати маску та xor, але тоді ми повинні були знати точний біт змінної. Зсуваючи біти спереду, нам не потрібно в будь-який час знати, скільки біт має int на машині чи компіляторі, і не потрібно включати додаткові бібліотеки.
cout << "INT_MAX:\t" << (int) ((~((unsigned int) 0)) >> 1) << '\n' << "UINT_MAX:\t" << ~((unsigned int) 0) << endl;
#include <climits>
#include <iostream>
using namespace std;
int main() {
cout << INT_MAX << endl;
}
numeric_limits<int>::max()
- працює також у контекстах шаблонів, але (з якихось незрозумілих мені причин) не може використовуватися як константа часу компіляції. INT_MAX
- є макросом, досить марним у функціях шаблону, але може використовуватися як константа часу компіляції.
Ось макрос, який я використовую, щоб отримати максимальне значення для підписаних цілих чисел, яке не залежить від розміру використовуваного цілого цілого типу, і на яке gcc -Woverflow не поскаржиться
#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);
Чому б не написати фрагмент коду, наприклад:
int max_neg = ~(1 << 31);
int all_ones = -1;
int max_pos = all_ones & max_neg;
Гаразд Я не маю жодної репутації, щоб коментувати попередню відповідь (Філіппа Де Мюйтера), ні піднімати її бал, отже новий приклад, використовуючи його визначення для 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;
На відміну від використання того чи іншого заголовка, тут ми використовуємо реальний тип від компілятора.
Про що (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))
працює.