Как бы вы установили для переменной максимально возможное число в C? - PullRequest
20 голосов
/ 16 февраля 2010

Как бы вы задали для переменной равную бесконечность (или любое гарантированное наибольшее значение числа) в C?

Ответы [ 10 ]

31 голосов
/ 16 февраля 2010
#include <limits.h>
int x = INT_MAX;

РЕДАКТИРОВАТЬ: ответил, прежде чем спрашивающий прояснил, я просто угадал, какой тип они хотели.

26 голосов
/ 16 февраля 2010

Существует файл с именем 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
9 голосов
/ 16 февраля 2010

На сегодняшний день самый простой способ получить наибольшее значение для целого типа без знака - это привести (-1) к этому типу.Стандарт (§6.2.5 / 9) требует, чтобы математика без знака выполнялась по модулю на единицу больше наибольшего значения, которое может быть представлено, поэтому для любого типа без знака T выражение ((T)-1) обязательно будет самым большимзначение возможно в этом типе.

8 голосов
/ 04 октября 2015

Другой портативный способ получить максимальное значение целого числа:

Целое число без знака

unsigned int uMax = (unsigned int)~0;

Целое число со знаком

signed int iMax = (unsigned int)~0 >> 1;

Объяснение

  • ~0 -> установка всех битов в один
  • >> 1 -> стирание знака, сдвигая все биты вправо на одну позицию
  • (unsigned int) приведение типа к unsigned int после инверсии битов вместо использования ~0U, потому что C не имеет суффикса для коротких литералов char (все меньше, чем int в целом)

Таким образом, для максимально возможного значения char - просто измените приведение типа формулы на без знака и т. д.

Бонус - минимальное значение со знаком int

Просто просто инвертируйте все биты еще раз в выражении макс. Со знаком int:

signed int iMin = ~((unsigned int)~0 >> 1);

Это устанавливает первый бит знака в один, а остальные биты в ноль

6 голосов
/ 16 февраля 2010

Исходя из ваших комментариев, вы хотите 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.

Обратите внимание, что поведение переполнения гарантируется только для целых типов без знака.

4 голосов
/ 16 февраля 2010

Поскольку в этом вопросе есть тег C ++, я предложу numeric_limits:

#include <limits>

unsigned x = std::numeric_limits<unsigned>::max();
2 голосов
/ 16 февраля 2010

Обычно это делается с помощью 1.0/0.0, но вы можете получить предупреждение об этом. Я не знаю других переносимых способов сделать это в C89, но у C99 есть макрос FP_INFINITE в math.h.

РЕДАКТИРОВАТЬ: Очевидно, Сэм на самом деле не хотел бесконечность, но целочисленные ограничения, которые можно найти в limits.h, как и другие заявили.

1 голос
/ 16 февраля 2010

Я думаю, вы можете проверить эту ссылку:

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 голос
/ 16 февраля 2010

Я обычно использую макросы *_MAX, найденные в limits.h INT_MAX для целых чисел и т. Д. Они всегда будут правильно установлены для типа переменной. Даже типы явно определенного размера, такие как uint32, будут иметь соответствующие записи в этом заголовочном файле.

Преимущество этого параметра - максимально возможное значение, которое может содержать переменная этого типа.

Для целого числа без знака, которое вы задали в своем вопросе, вы должны использовать UINT_MAX

0 голосов
/ 08 июля 2018
  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//
...