Есть ли код, чтобы найти максимальное значение целого числа (в соответствии с компилятором) в 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
минимальное значение. То же самое касается макросов / констант Си.
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 как результат ', пока размер не будет подписан int.
size = (unsigned int)size >> 1; // Shift the bits of size one position to the right.
Как говорит Стандарт, биты, которые сдвинуты, равны 1, если переменная подписана, и отрицательны, и 0, если переменная будет без знака или со знаком, и положительна.
Поскольку размер подписан и отрицателен, мы будем сдвигать бит знака, который равен 1, что не очень помогает, поэтому мы приводим к unsigned 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))
работает.