Здесь не будет выброшено никаких исключений. Но это произойдет, если попробовать такое:
double d = -3.14;
unsigned int ui = numeric_cast<unsigned int>(d);
Потому что, несмотря на то что происходит потеря всего, что находится справа от десятичной точки, происходит потеря знака, а это очень плохо.
Рецепты 3.1 и 3.3.
3.7. Получение минимального и максимального значений числового типа
Требуется узнать наибольшее и наименьшее значения, представляемые на данной платформе числовым типом, таким как int
или double
.
Чтобы среди прочего получить максимальное и минимальное допустимые значения числового типа, используйте шаблон класса numeric_limits
из заголовочного файла <limits>
(см. пример 3.9).
#include <iostream>
#include <limits>
using namespace std;
template<typename T>
void showMinMax() {
cout << 'min: ' << numeric_limits<T>::min() << endl;
cout << 'max: ' << numeric_limits<T>::max() << endl;
cout << endl;
}
int main() {
cout << 'short:' << endl;
showMinMax<short>();
cout << 'int:' << endl;
showMinMax<int>();
cout << 'long:' << endl;
showMinMax<long>();
cout << 'float:' << endl;
showMinMax<float>();
cout << 'double:' << endl;
showMinMax<double>();
cout << 'long double:' << endl;
showMinMax<long double>();
cout << 'unsigned short:' << endl;
showMinMax<unsigned short>();
cout << 'unsigned int:' << endl;
showMinMax<unsigned int>();
cout << 'unsigned long:' << endl;
showMinMax<unsigned long>();
}
Вот что я получил в Windows XP, используя Visual C++ 7.1.
short:
min: -32768
max: 32767
int:
min: -2147483648
max: 2147483647
long:
min -2147483648
max 2147483647
float:
min: 1.17549e-038
max: 3.40282e-038
double:
min: 2.22507e-308
max: 1.79769e+308
long double:
min: 2.22507e-308
max: 1.79769e+308
unsigned short:
min: 0
max: 65535
unsigned int:
min: 0
max: 4294967295
unsigned long:
min: 0
max: 4294967295
Пример 3.9 показывает простой пример получения минимального и максимального значений встроенных числовых типов. Шаблон класса numeric_limits
имеет специализации для всех встроенных типов, включая как числовые, так и нечисловые типы. Стандарт требует, чтобы все типы, которые я использовал в примере 3.9, а также перечисленные далее, имели свою специализацию numeric_limits
.
bool
char
signed char
unsigned char
wchar_t