Как бы вы установили переменную на максимально возможное число в C?
Как бы вы установили переменную равной бесконечности (или любое гарантированное значение наибольшего числа) в C?
10 ответов
#include <limits.h>
int x = INT_MAX;
РЕДАКТИРОВАТЬ: ответил, прежде чем спрашивающий прояснил, я просто угадал, какой тип они хотели.
Существует файл с именем limit.h (по крайней мере, в Linux), который содержит такое определение, например:
/* Maximum value an `unsigned short int' can hold. (Minimum is 0.) */
# define USHRT_MAX 65535
/* Minimum and maximum values a `signed int' can hold. */
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647
/* Maximum value an `unsigned int' can hold. (Minimum is 0.) */
# define UINT_MAX 4294967295U
Другой портативный способ получить максимальное значение целого числа без знака - это установить все биты в один:
unsigned int uMax = ~0;
Безусловно, самый простой способ получить наибольшее значение для целочисленного типа без знака - привести значение (-1) к этому типу. Стандарт (§6.2.5/9) требует, чтобы математика без знака выполнялась по модулю на единицу больше наибольшего значения, которое может быть представлено, поэтому для любого типа без знака T
, выражение ((T)-1)
обязательно будет наибольшим возможным значением в этом типе.
Основываясь на ваших комментариях, вы хотите unsigned int
(хотя вы говорите "целое число без знака", так что, возможно, вам нужно целочисленное значение, а не обязательно unsigned int
).
В C для целого типа без знака значение -1
при преобразовании в этот тип гарантированно будет наибольшее значение этого типа:
size_t size_max = -1;
unsigned int uint_max = -1;
unsigned long ulong_max = -1;
назначить значения SIZE_MAX
, UINT_MAX
а также ULONG_MAX
к переменным соответственно. В общем, вы должны включить limits.h
и используйте соответствующий макрос, но приятно знать правило выше. Также, SIZE_MAX
не в с89, так size_t size_max = -1;
будет работать как в C89, так и в C99.
Обратите внимание, что поведение переполнения гарантировано только для целых типов без знака.
Поскольку в этом вопросе есть тег C++, я предложу numeric_limits:
#include <limits>
unsigned x = std::numeric_limits<unsigned>::max();
Обычно это делается 1.0/0.0
, но вы можете получить предупреждение об этом. Я не знаю других портативных способов сделать это в C89, но C99 имеет макрос FP_INFINITE
в math.h
,
РЕДАКТИРОВАТЬ: Очевидно, что Сэм на самом деле не хотел бесконечность, но целочисленные ограничения, которые можно найти в limits.h
как и другие заявили.
Я обычно использую *_MAX
макросы найдены в limits.h
INT_MAX
для целых чисел и т. д. Они всегда будут правильно установлены для типа переменной. Даже типы явно определенного размера, такие как uint32, будут иметь соответствующие записи в этом заголовочном файле.
Преимущество в том, что это максимально возможное значение, которое может содержать переменная этого типа.
Для целого числа без знака, как вы просили в своем вопросе, вы должны использовать UINT_MAX
Я думаю, вы можете проверить эту ссылку:
http://www.gnu.org/s/libc/manual/html_node/Infinity-and-NaN.html
Я сделал это, и он прекрасно работает на GCC 4.4.1
#include "math.h"
int main(int argc, char**argv)
{
int x = INFINITY;
return 0;
}
- Во-первых, включите заголовочный файл с именем math.h
- Теперь приравниваем INT_MAX к целому числу, значение которого вы хотите установить максимум. ПРИМЕР:
#include<math.h> //the header file which need to be included// int a=INT_MAX; //Suppose "a" be that integer whose value you want largest//