Эквивалентность ‹limits› и ‹climits›

  1. Гарантировано ли, что это всегда верно:

    std::numeric_limits<int>::max() == INT_MAX
    

    Что об этом говорит стандарт С++? Я не смог найти в стандарте ни одной ссылки, в которой бы это прямо указывалось, но я продолжаю читать, что они должны быть эквивалентны.

  2. Как насчет типов C99, которые не входят в стандарт C++98 для компиляторов, реализующих как C99 (как минимум long long часть), так и C++98? Я не уверен, есть ли какая-либо гарантия, что это всегда верно:

    std::numeric_limits<unsigned long long>::max() == ULLONG_MAX
    

    Это разумное предположение?


person Alex B    schedule 17.03.2009    source источник


Ответы (4)


В моей копии стандарта С++ 2003 говорится, что шаблоны numeric_limits<>::max() и min() будут возвращать значения:

Эквивалентно CHAR_MIN, SHRT_MIN, FLT_MIN, DBL_MIN, и т. д.

Эквивалентно CHAR_MAX, SHRT_MAX, FLT_MAX, DBL_MAX, и т. д.

Однако они есть в сносках. Директивы ISO/IEC Часть 3: «[Сноски] не должны содержать требований». Хотя сноски к таблицам или рисункам могут быть обязательными.

person Michael Burr    schedule 17.03.2009
comment
Чтобы быть педантичным, сноски не являются частью стандарта. - person dirkgently; 17.03.2009
comment
@dirkgently - Вы правы (хотя это и сложно найти). Это часть 3 директив ISO/IEC: [Сноски] не должны содержать требований. Хотя сноски к таблицам или рисункам могут быть обязательными. - person Michael Burr; 18.03.2009
comment
К сожалению, похоже, это единственное место в стандарте, где это упоминается. - person Alex B; 22.03.2009

Первое должно быть гарантировано истинным: std::numeric_limits<int>::max() == INT_MAX.

Однако для unsigned long long нет никаких гарантий, поскольку компилятор/библиотеки не обязаны их поддерживать. Но...

Если ваш компилятор и библиотеки поддерживают unsigned long long, они должны быть равными, поскольку ограничения для типов будут одинаковыми независимо от того, как вы спрашиваете.

да, это разумное предположение.

person Evan Teran    schedule 17.03.2009

Очевидно, что для длинных длинных типов данных в C++ нет никаких гарантий, поскольку длинных длинных типов данных еще не существует в C++. Как они себя ведут, если и когда они существуют, зависит от компилятора и должен документироваться компилятором.

person jalf    schedule 17.03.2009

Хотя, насколько мне известно, это не является частью ни одного из стандартов, это, безусловно, разумное предположение, особенно если у вас есть компиляторы того же набора или поставщика. Например, G++ 4.3 просто использует значения #defined из <limits> в <climits>.

person Matt J    schedule 17.03.2009