Гарантировано ли, что это всегда верно:
std::numeric_limits<int>::max() == INT_MAXЧто об этом говорит стандарт С++? Я не смог найти в стандарте ни одной ссылки, в которой бы это прямо указывалось, но я продолжаю читать, что они должны быть эквивалентны.
Как насчет типов C99, которые не входят в стандарт C++98 для компиляторов, реализующих как C99 (как минимум
long longчасть), так и C++98? Я не уверен, есть ли какая-либо гарантия, что это всегда верно:std::numeric_limits<unsigned long long>::max() == ULLONG_MAXЭто разумное предположение?
Эквивалентность ‹limits› и ‹climits›
Ответы (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: «[Сноски] не должны содержать требований». Хотя сноски к таблицам или рисункам могут быть обязательными.
Первое должно быть гарантировано истинным: std::numeric_limits<int>::max() == INT_MAX.
Однако для unsigned long long нет никаких гарантий, поскольку компилятор/библиотеки не обязаны их поддерживать. Но...
Если ваш компилятор и библиотеки поддерживают unsigned long long, они должны быть равными, поскольку ограничения для типов будут одинаковыми независимо от того, как вы спрашиваете.
да, это разумное предположение.
Очевидно, что для длинных длинных типов данных в C++ нет никаких гарантий, поскольку длинных длинных типов данных еще не существует в C++. Как они себя ведут, если и когда они существуют, зависит от компилятора и должен документироваться компилятором.
Хотя, насколько мне известно, это не является частью ни одного из стандартов, это, безусловно, разумное предположение, особенно если у вас есть компиляторы того же набора или поставщика. Например, G++ 4.3 просто использует значения #defined из <limits> в <climits>.