![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Return 0;. Результат работы программы: 5 – 10 = 4294967291
}
Результат работы программы: 5 – 10 = 4294967291
Таким образом, несмотря на то, что язык C++ достаточно «снисходителен» к действиям программиста, это требует от программиста еще большей дисциплины в его действиях и четких знаний нюансов языка программирования. Для исправления ошибки в работе предыдущей программы можно, например, изменить вычисление выражения a – b следующим образом: (int) a – b или int(a) – b. В этом случае мы получим правильный результат: 5 – 10 = -5. Здесь было использовано явное преобразование типов данных. Явное преобразование типов данных осуществляется с помощью соответствующей операции преобразования типов данных, которая имеет один из двух следующих форматов:
(< тип данных>) < выражение> или < тип данных> (< выражение>) Например:
(int) 3.14 int (3.14) (double) a или double (a) (long) (a + 1e5f) long (a + 1e5f) Подобные преобразования имеют своим исходом три ситуации: · преобразование без потерь; · с потерей точности; · с потерей данных. Преобразование происходит без потерь, если преобразуемое значение принадлежит множеству значений типа, к которому осуществляется преобразование. Например:
short a = 100; cout < < (int) a < < endl; // На экран выведено 100 cout < < (char) a < < endl; // Выведена буква d (ее десятичный эквивалент - 100) cout < < (float) a < < endl; // На экран выведено 100 cout < < (double) a < < endl; // На экран выведено 100 float b = 3.14f; cout < < (double) b < < endl; // На экран выведено 3.14 double d = 3.14; cout < < (float) d < < endl; // На экран выведено 3.14
Преобразование любого вещественного типа к целому осуществляется путем отбрасывания дробной части вещественного значения, поэтому практически всегда такие преобразования приводят к потере точности (осуществляются приближенно). Например:
double d = 3.74; cout < < (int) d < < endl; // На экран выведено 3 А вот попытки преобразования значений выходящих за пределы диапазона типа данных, к которому осуществляется преобразование, приводят к полному искажению данных. Например:
int a = -100; cout < < (unsigned) a < < endl; // На экран выведено 4294967196 int a = 50000; cout < < (short) a < < endl; // На экран выведено -15536 float b = 3e+9f; cout < < (int) b < < endl; // На экран выведено -2147483648 double d = 3e+9; cout < < (int) d < < endl; // На экран выведено -2147483648 double d = 3e+40; cout < < (float) d < < endl; // На экран выведено 1.#INF - переполнение double d = -3e+40; cout < < (float) d < < endl; // На экран выведено - 1.#INF - переполнение Рассмотренная операция преобразования типов перешла в C++ из C. В C++ имеются свои операции преобразования типов данных. Например, рассмотренные выше преобразования в C++ можно было бы выполнить с помощью операции static_cast, имеющей следующий формат:
static_cast < тип данных> (выражение)
Например: static_cast < double> (a + 2e+40f) Пользоваться явными преобразованиями типов следует очень аккуратно и только там, где это действительно необходимо. При явном преобразовании типов значения преобразуемых величин на самом деле не изменяются – изменяется только представление этих значений при выполнении действий над ними.
|