Как бы вы установили переменную на максимально возможное число в 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;
}


  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//