Как бы вы установили переменную на максимально возможное число в C?
Как бы вы установили переменную равной бесконечности (или любому гарантированному наибольшему значению числа) в C?
10 ответов
#include <limits.h>
int x = INT_MAX;
EDIT: ответил До того, как вопрос уточнил, я просто угадал, какой тип они хотели.
существует файл под названием limits.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
на сегодняшний день самый простой способ получить наибольшее значение для целочисленного типа без знака-это привести (-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
не в C89, так что size_t size_max = -1;
будет работать в C89, а также C99.
обратите внимание, что поведение переполнения гарантируется только для беззнаковых интегральных типов.
другой портативный способ получить максимальное значение целого числа без знака-установить все биты в один:
unsigned int uMax = ~0;
поскольку в этом вопросе есть тег C++, я предлагаю numeric_limits:
#include <limits>
unsigned x = std::numeric_limits<unsigned>::max();
обычно это делается с помощью 1.0/0.0
, но вы можете получить предупреждение о компиляции. Я не знаю других портативных способов сделать это в C89, но C99 имеет макрос FP_INFINITE
на math.h
.
EDIT: по-видимому, Сэм на самом деле не хотел бесконечности, но целочисленные пределы, которые можно найти в 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//