Содержание

Макро для численных пределов

Несмотря на то, что численные типы в зависимости от реализации компилятора C могут иметь различные диапазоны, можно написать программу, которая будет приспосабливаться к этим изменяющимся диапазонам. В большинстве случаев легко видеть, достаточно ли велик целый объект для того, чтобы хранить все необходимые значения, независимо от того, занимает он только 16 бит или нет.

Однако программисту может понадобиться компилировать код в зависимости от информации о диапазоне некоторых типов. Заголовочный файл <limits.h> определяет набор макро, которые описывают диапазоны различных целых типов. Заголовочный файл <float.h> определяет ещё один набор макро, которые описывают диапазоны и другие характеристики различных типов с плавающей точкой.

Численные пределы для целых типов

Следующие макро заменяются на константное выражение, которое можно использовать в директиве препроцессора #if. У компилятора, удовлетворяющего стандарту C, модуль выражения должен быть равен или больше значений ANSI приведённых ниже, при том же знаке. (Положительные значения должны быть больше или равны значений ANSI. Отрицательные — меньше или равны.) Значения для реальных компиляторов показаны следом за значениями ANSI.

Численные пределы для типов с плавающей точкой

Следующие макро заменяются выражениями, которые не обязательно будут константами. У компилятора, удовлетворяющего стандарту C, модуль выражения должен быть равен или больше значений ANSI приведённых ниже, при том же знаке. (Положительные значения должны быть больше или равны значений ANSI. Отрицательные — меньше или равны.) Значения для реальных компиляторов показаны следом за значениями ANSI. Большинство компиляторов перекрывают эти значения.

Для тех характеристик, которые имеют три различных макро, макро, которое начинается с FLT_ относится к типу float, DBL_ к типу double, а LDBL_ — к long double.

Как говорилось в разделе Преобразования целых в типы с плавающей точкой, макро FLT_ROUNDS заменяется на константное выражение, чьё значение представляет способ округления после операции с плавающей точкой. В следующей таблице приводятся значения FLT_ROUNDS и их смысл:

FLT_ROUNDS Округление
-1 неопределённое
0 в сторону нуля
1 до ближайшего числа
2 в сторону плюс бесконечности
3 в сторону минус бесконечности

Если FLT_ROUNDS имеет какое-либо другое значение, то механизм округления зависит от реализации.

Для компиляторов Watcom C/16 и C/32 значение FLT_ROUNDS равно 1, это значит, что числа с плавающей точкой округляются до ближайшего представимого числа.