8 ответов:
В 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();
В C:
#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;
Я знаю, это старый вопрос, но может кто-то может использовать это решение:
int size = 0; // Fill all bits with zero (0) size = ~size; // Negate all bits, thus all bits are set to one (1)пока у нас -1 в результате до в размере - это знаковый int.
size = (unsigned int)size >> 1; // Shift the bits of size one position to the right.как стандарт говорит, биты, которые сдвигаются в 1, если переменная со знаком и отрицательным и 0, если переменная будет без знака или со знаком и положительным.
как в размере подписано и отрицательно мы бы сдвинули знаковый бит, который равен 1, что не очень помогает, поэтому мы бросили беззнаковый инт, вынудив переложить в 0 вместо того, чтобы, установив знаковый бит в 0, а то все остальные биты остаются равными 1.
cout << size << endl; // Prints out size which is now set to maximum positive value.мы также могли бы использовать маску и xor, но тогда мы должны были знать точный размер переменной. При сдвиге в битах спереди нам не нужно знать в любое время, сколько бит int имеет на машине или компиляторе, и нам не нужно включать дополнительные библиотеки.
почему бы не написать фрагмент кода, вроде:
int max_neg = ~(1 << 31); int all_ones = -1; int max_pos = all_ones & max_neg;
вот макрос, который я использую, чтобы получить максимальное значение для целых чисел со знаком, которое не зависит от размера используемого типа целого числа со знаком, и для которого 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);
О. К. У меня нет rep, чтобы прокомментировать предыдущий ответ (Филиппа де Мюйтера), ни поднять его счет, следовательно, новый пример, используя его определение для 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;в отличие от использования того или иного заголовка, здесь мы используем реальный тип компилятора.
для конкретного максимального значения int, Я обычно пишу шестнадцатеричную нотацию:
int my_max_int = 0x7fffffff;вместо нерегулярного десятичного значения:
int my_max_int = 2147483647;
а как же
(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))строительство.
Comments