Как бы вы установили переменную на максимально возможное число в 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.hINT_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;
}
  1. Во-первых, включите заголовочный файл с именем math.h
  2. Теперь приравниваем 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//
Другие вопросы по тегам