int x = f;
cout << x << ' ' << f << '\n';
Значение переменной x
будет равно 2
. Оно не будет равным 3
, как вы могли подумать, если применили “правило округления 4/5”. В языке C++ преобразование типа float
в тип int
сопровождается усечением, а не округлением.
Язык C++ не решит эту проблему за вас. Рассмотрим пример.
void f(int i, double fpd)
{
char c = i; // да: тип char действительно представляет
// очень маленькие целые числа
short s = i; // опасно: переменная типа int может
// не поместиться
// в памяти, выделенной для переменной
// типа short
i = i+1; // что, если число i станет максимальным?
long lg = i*i; // опасно: переменная типа long не может
// вместить результат
float fps = fpd; // опасно: большее число типа large может
// не поместиться в типе float
i = fpd; // усечение: например, 5.7 –> 5
fps = i; // можно потерять точность (при очень
// больших целых)
}
void g()
{
char ch = 0;
for (int i = 0; i<500; ++i)
cout << int(ch++) << '\t';
}
Если сомневаетесь, поэкспериментируйте! Не следует отчаиваться и в то же время нельзя просто читать документацию. Без экспериментирования вы можете не понять содержание весьма сложной документации, связанной с числовыми типами.
ПОПРОБУЙТЕ
Выполните функцию g()
. Модифицируйте функцию f()
так, чтобы она выводила на печать переменные c
, s
, i
и т.д. Протестируйте программу на разных значениях.
double
и избегая типа float
, мы минимизируем вероятность возникновения проблем, связанных с преобразованием double
— float
. Например, мы предпочитаем использовать только типы int
, double
и complex
(см. раздел 24.9) для вычислений, char
— для символов и bool
— для логических сущностей. Остальные арифметические типы мы используем только при крайней необходимости.
24.2.1. Пределы числовых диапазонов
,
и
, чтобы программисты могли проверить пределы диапазонов, установить сигнальные метки и т.д. Эти значения перечислены в разделе Б.9.1. Они играют очень важную роль для создания низкоуровневых инструментов. Если они вам нужны, значит, вы работаете непосредственно с аппаратным обеспечением, хотя существуют и другие приложения. Например, довольно часто возникают вопросы о тонкостях реализации языка, например: “Насколько большим является тип int
?” или “Имеет ли знак тип char
?” Найти определенные и правильные ответы в системной документации бывает трудно, а в стандарте указаны только минимальные требования. Однако можно легко написать программу, находящую ответы на эти вопросы.
cout << "количество байтов в типе int: " << sizeof(int) << '\n';
cout << "наибольшее число типа int: " << INT_MAX << endl;
cout << "наименьшее число типа int: " << numeric_limits
<< '\n';
if (numeric_limits
cout << "тип char имеет знак n";
else
cout << "тип char не имеет знака\n";
cout << "char с минимальным значением: "
<< numeric_limits
cout << "минимальное значение типа char: "
<< int(numeric_limits
Если вы пишете программу, которая должна работать на разных компьютерах, то возникает необходимость сделать эту информацию доступной для вашей программы. Иначе вам придется “зашить” ответы в программу, усложнив ее сопровождение.
Эти пределы также могут быть полезными для выявления переполнения.
24.3. Массивы