Содержание
Макро для численных пределов
Несмотря на то, что численные типы в зависимости от реализации компилятора C
могут иметь различные диапазоны, можно написать программу, которая будет
приспосабливаться к этим изменяющимся диапазонам. В большинстве случаев легко
видеть, достаточно ли велик целый объект для того, чтобы хранить все
необходимые значения, независимо от того, занимает он только 16 бит или нет.
Однако программисту может понадобиться компилировать код в зависимости от
информации о диапазоне некоторых типов. Заголовочный файл
<limits.h>
определяет набор макро, которые описывают диапазоны
различных целых типов. Заголовочный файл <float.h>
определяет
ещё один набор макро, которые описывают диапазоны и другие характеристики
различных типов с плавающей точкой.
Численные пределы для целых типов
Следующие макро заменяются на константное выражение, которое можно
использовать в директиве препроцессора #if
. У компилятора,
удовлетворяющего стандарту C, модуль выражения должен быть равен или больше
значений ANSI приведённых ниже, при том же знаке. (Положительные значения
должны быть больше или равны значений ANSI. Отрицательные — меньше или
равны.) Значения для реальных компиляторов показаны следом за значениями
ANSI.
-
число бит в наименьшем объекте, который не является битовым полем (байт)
Макро: CHAR_BIT |
Значение |
ANSI |
>= 8 |
Watcom C/16 и C/32 |
8 |
-
минимальное значение объекта типа
signed char
Макро: SCHAR_MIN |
Значение |
ANSI |
<= -127 |
Watcom C/16 и C/32 |
-128 |
-
максимальное значение объекта типа
signed char
Макро: SCHAR_MAX |
Значение |
ANSI |
>= 127 |
Watcom C/16 и C/32 |
127 |
-
максимальное значение объекта типа
unsigned char
Макро: UCHAR_MAX |
Значение |
ANSI |
>= 255 |
Watcom C/16 и C/32 |
255 |
-
минимальное значение объекта типа
char
Если char
— беззнаковый (по умолчанию)
Макро: CHAR_MIN |
Значение |
ANSI |
0 |
Watcom C/16 и C/32 |
0 |
Если char
— знаковый (при использовании ключа командной
строки), то CHAR_MIN
эквивалентно SCHAR_MIN
Макро: CHAR_MIN |
Значение |
ANSI |
<= -127 |
Watcom C/16 и C/32 |
-128 |
-
максимальное значение объекта типа
char
Если char
— беззнаковый (по умолчанию), то
CHAR_MAX
эквивалентно UCHAR_MAX
Макро: CHAR_MAX |
Значение |
ANSI |
>= 255 |
Watcom C/16 и C/32 |
255 |
Если char
— знаковый (при использовании ключа командной
строки), то CHAR_MAX
эквивалентно SCHAR_MAX
Макро: CHAR_MAX |
Значение |
ANSI |
>= 127 |
Watcom C/16 и C/32 |
127 |
-
максимальное число байт в многобайтовом символе, для любой поддерживаемой локализации
Макро: MB_LEN_MAX |
Значение |
ANSI |
>= 1 |
Watcom C/16 и C/32 |
2 |
-
минимальное значение объекта типа
short int
Макро: SHRT_MIN |
Значение |
ANSI |
<= -32767 |
Watcom C/16 и C/32 |
-32768 |
-
максимальное значение объекта типа
short int
Макро: SHRT_MAX |
Значение |
ANSI |
>= 32767 |
Watcom C/16 и C/32 |
32767 |
-
максимальное значение объекта типа
unsigned short int
Макро: USHRT_MAX |
Значение |
ANSI |
>= 65535 |
Watcom C/16 и C/32 |
65535 |
-
минимальное значение объекта типа
int
Макро: INT_MIN |
Значение |
ANSI |
<= -32767 |
Watcom C/16 |
-32768 |
Watcom C/32 |
-2147483648 |
-
максимальное значение объекта типа
int
Макро: INT_MAX |
Значение |
ANSI |
>= 32767 |
Watcom C/16 |
32767 |
Watcom C/32 |
2147483647 |
-
максимальное значение объекта типа
unsigned int
Макро: UINT_MAX |
Значение |
ANSI |
>= 65535 |
Watcom C/16 |
65535 |
Watcom C/32 |
4294967295 |
-
минимальное значение объекта типа
long int
Макро: LONG_MIN |
Значение |
ANSI |
<= -2147483647 |
Watcom C/16 и C/32 |
-2147483648 |
-
максимальное значение объекта типа
long int
Макро: LONG_MAX |
Значение |
ANSI |
>= 2147483647 |
Watcom C/16 и C/32 |
2147483647 |
-
максимальное значение объекта типа
unsigned long int
Макро: ULONG_MAX |
Значение |
ANSI |
>= 4294967295 |
Watcom C/16 и C/32 |
4294967295 |
Численные пределы для типов с плавающей точкой
Следующие макро заменяются выражениями, которые не обязательно будут
константами. У компилятора, удовлетворяющего стандарту C, модуль выражения
должен быть равен или больше значений ANSI приведённых ниже, при том же
знаке. (Положительные значения должны быть больше или равны значений ANSI.
Отрицательные — меньше или равны.) Значения для реальных компиляторов
показаны следом за значениями ANSI. Большинство компиляторов перекрывают эти
значения.
Для тех характеристик, которые имеют три различных макро, макро, которое
начинается с FLT_
относится к типу float
,
DBL_
к типу double
, а LDBL_
— к
long double
.
-
основание системы счисления для экспоненты
Макро: FLT_RADIX |
Значение |
ANSI |
>= 2 |
Watcom C/16 и C/32 |
2 |
-
точность или число цифр в мантиссе числа с плавающей точкой, выраженная в
терминах
FLT_RADIX
Макро: FLT_MANT_DIG |
Значение |
ANSI |
не указано |
Watcom C/16 и C/32 |
23 |
Макро: DBL_MANT_DIG |
Значение |
ANSI |
не указано |
Watcom C/16 и C/32 |
52 |
Макро: LDBL_MANT_DIG |
Значение |
ANSI |
не указано |
Watcom C/16 и C/32 |
52 |
-
число точных десятичных цифр
Макро: FLT_DIG |
Значение |
ANSI |
>= 6 |
Watcom C/16 и C/32 |
6 |
Макро: DBL_DIG |
Значение |
ANSI |
>= 10 |
Watcom C/16 и C/32 |
15 |
Макро: LDBL_DIG |
Значение |
ANSI |
>= 10 |
Watcom C/16 и C/32 |
15 |
-
минимальное отрицательное
n
, такое, что
FLT_RADIX
возведённое в степень n
минус 1 является
нормализованным числом с плавающей точкой, или
-
минимальное значение экспоненты в терминах
FLT_RADIX
, или
-
экспонента по основанию
FLT_RADIX
для значения с плавающей
точкой, ближайшего, но не равного нулю
Макро: FLT_MIN_EXP |
Значение |
ANSI |
не указано |
Watcom C/16 и C/32 |
-127 |
Макро: DBL_MIN_EXP |
Значение |
ANSI |
не указано |
Watcom C/16 и C/32 |
-1023 |
Макро: LDBL_MIN_EXP |
Значение |
ANSI |
не указано |
Watcom C/16 и C/32 |
-1023 |
-
минимальное отрицательное целое
n
, такое, что 10 в степени
n
находится в диапазоне нормализованных чисел с плавающей
точкой, или
-
экспонента по основанию 10 для значения числа с плавающей точкой,
ближайшего, но не равного нулю
Макро: FLT_MIN_10_EXP |
Значение |
ANSI |
<= -37 |
Watcom C/16 и C/32 |
-38 |
Макро: DBL_MIN_10_EXP |
Значение |
ANSI |
<= -37 |
Watcom C/16 и C/32 |
-307 |
Макро: LDBL_MIN_10_EXP |
Значение |
ANSI |
<= -37 |
Watcom C/16 и C/32 |
-307 |
-
максимальное
n
, такое, что FLT_RADIX
в
степени n
минус 1 имеет конечную форму представления, или
-
максимальное значение экспоненты в терминах
FLT_RADIX
, или
-
экспонента по основанию
FLT_RADIX
для наибольшего допустимого числа с плавающей точкой
Макро: FLT_MAX_EXP |
Значение |
ANSI |
не указано |
Watcom C/16 и C/32 |
127 |
Макро: DBL_MAX_EXP |
Значение |
ANSI |
не указано |
Watcom C/16 и C/32 |
1023 |
Макро: LDBL_MAX_EXP |
Значение |
ANSI |
не указано |
Watcom C/16 и C/32 |
1023 |
-
максимальное целое
n
, такое, что 10 в степени n
имеет конечную форму представления, или
-
экспонента по основанию 10 для наибольшего допустимого числа с
плавающей точкой
Макро: FLT_MAX_10_EXP |
Значение |
ANSI |
>= 37 |
Watcom C/16 и C/32 |
38 |
Макро: DBL_MAX_10_EXP |
Значение |
ANSI |
>= 37 |
Watcom C/16 и C/32 |
308 |
Макро: LDBL_MAX_10_EXP |
Значение |
ANSI |
>= 37 |
Watcom C/16 и C/32 |
308 |
-
наибольшее представимое конечное число с плавающей точкой
Макро: FLT_MAX |
Значение |
ANSI |
>= 1E+37 |
Watcom C/16 и C/32 |
3.402823466E+38 |
Макро: DBL_MAX |
Значение |
ANSI |
>= 1E+37 |
Watcom C/16 и C/32 |
1.79769313486231560E+308 |
Макро: LDBL_MAX |
Значение |
ANSI |
>= 1E+37 |
Watcom C/16 и C/32 |
1.79769313486231560E+308 |
-
разница между 1.0 и наименьшим числом большим 1.0, которая представима
как данное этого типа с плавающей точкой, или
-
наименьшее число
eps
, такое, что (1.0 + eps) !=
1.0
Макро: FLT_EPSILON |
Значение |
ANSI |
<= 1E-5 |
Watcom C/16 и C/32 |
1.192092896E-15 |
Макро: DBL_EPSILON |
Значение |
ANSI |
<= 1E-9 |
Watcom C/16 и C/32 |
2.2204460492503131E-16 |
Макро: LDBL_EPSILON |
Значение |
ANSI |
<= 1E-9 |
Watcom C/16 и C/32 |
2.2204460492503131E-16 |
-
минимальное положительное нормализованное число с плавающей точкой
Макро: FLT_MIN |
Значение |
ANSI |
<= 1E-37 |
Watcom C/16 и C/32 |
1.175494351E-38 |
Макро: DBL_MIN |
Значение |
ANSI |
<= 1E-37 |
Watcom C/16 и C/32 |
2.22507385850720160E-308 |
Макро: LDBL_MIN |
Значение |
ANSI |
<= 1E-37 |
Watcom C/16 и C/32 |
2.22507385850720160E-308 |
Как говорилось в разделе Преобразования целых в типы с плавающей
точкой, макро FLT_ROUNDS
заменяется на константное
выражение, чьё значение представляет способ округления после операции с
плавающей точкой. В следующей таблице приводятся значения
FLT_ROUNDS
и их смысл:
FLT_ROUNDS |
Округление |
-1 |
неопределённое |
0 |
в сторону нуля |
1 |
до ближайшего числа |
2 |
в сторону плюс бесконечности |
3 |
в сторону минус бесконечности |
Если FLT_ROUNDS
имеет какое-либо другое значение, то механизм
округления зависит от реализации.
Для компиляторов Watcom C/16 и C/32 значение FLT_ROUNDS
равно 1
, это значит, что числа с плавающей точкой
округляются до ближайшего представимого числа.