КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Преобразования типов
При вычислении выражений некоторые операции требуют, чтобы операнды имели соответствующий тип, в противном же случае на этапе компиляции выдается сообщение об ошибке. Например, операция взятия остатка от деления (%) требует целочисленных операндов. Поэтому в языке С++ есть возможность приведения значений одного типа к другому. Преобразование типов – это приведение значения переменной одного типа в значение другого типа. Выделяют явное и неявное приведения типов. При явном приведении указывается тип переменной, к которому необходимо преобразовать исходную переменную. При неявном приведении преобразование происходит автоматически, по правилам, заложенным в языке программирования С++. Формат операции явного преобразования типов: имя_типа (операнд) Например, int(x), float(2/5), long(x+y/0.5). Пример 1. //Взятие цифры разряда сотых в дробном числе #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]){ float s,t; long int a,b; printf("Введите вещественное число\n"); scanf("%f", &s); t=s*100; a=int(t); //переменная t приводится к типу int в переменную a b=a%10; printf("\nЦифра разряда сотых числа %f равна %d.", s, b); system("pause"); return 0; } Преобразования типов нужно применять с осторожностью, так как данная операция может приводить к потере информации. Например, после приведения длинного типа к более короткому происходит усечение информации из старших битов.
Пример 2.Временной интервал Заданы моменты начала и конца некоторого промежутка времени в часах, минутах и секундах (в пределах одних суток). Найти продолжительность этого промежутка в тех же единицах. Исходными данными для этой задачи являются шесть целых величин, задающих моменты начала и конца интервала, результатами – три целых величины (тип int). Обозначим переменные для хранения начала интервала hour1, min1 и sec1, для хранения конца интервала – hour2, min2 и sec2, а результирующие величины – hour, min и sec. Для решения этой задачи необходимо преобразовать оба момента времени в секунды, вычесть первый из второго, а затем преобразовать результат обратно в часы, минуты и секунды. Следовательно, потребуется промежуточная переменная sum_sec, в которой будет храниться величина интервала в секундах. Она может иметь весьма большие значения, ведь в сутках 86400 секунд, что выходит за пределы типа int. Следовательно, для этой переменной выберем длинный целый тип (long int, сокращенно long). Для перевода результата из секунд обратно в часы и минуты используется отбрасывание дробной части при делении целого числа на целое. //Временной интервал. Форматированный ввод-вывод данных #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]){ int hour1, min1, sec1, hour2, min2, sec2, hour, min, sec; long int sum_sec; printf("Введите время начала интервала (час мин сек)\n"); scanf("%d%d%d", &hour1,&min1,&sec1); printf("Введите время окончания интервала (час мин сек)\n"); scanf("%d%d%d", &hour2,&min2,&sec2); sum_sec = (hour2-hour1)*3600+(min2-min1)*60+sec2-sec1; hour = sum_sec/3600; min = (sum_sec-hour*3600)/60; sec = sum_sec-hour*3600-min*60; printf("Продолжительность промежутка от %d:%d:%d до %d:%d:%d\n",hour1,min1,sec1,hour2,min2,sec2); printf(" равна %d:%d:%d\n",hour,min,sec); system("pause"); return 0; } При выполнении математических операций производится неявное (автоматическое) преобразование типов, чтобы привести операнды выражений к общему типу или чтобы расширить короткие величины до размера целых величин, используемых в машинных командах. Выполнение преобразования зависит от специфики операций и от типа операнда или операндов. 1. Преобразование целых типов со знаком. · Целое со знаком преобразуется к более короткому целому со знаком, с потерей информации: пропадают все разряды числа, которые находятся выше (или, соответственно – ниже) границы, определяющей максимальный размер переменной. · Целое со знаком преобразуется к более длинному целому со знаком. Путем размножения знака. То есть все добавленные биты двоичного числа будут заняты тем же числом, которое находилось в знаковом бите: если число было положительным, то это будет, соответственно 0, если отрицательным, то 1. · Целое со знаком к целому без знака. Первым шагом целое со знаком преобразуется к целому со знаком, соответствующему целевому типу, если этот тип данных крупнее. У получившегося значения бит знака не отбрасывается, а рассматривается равноправным по отношению к остальным битам, то есть теперь все биты образуют числовое значение. · Преобразование целого со знаком к плавающему типу происходит без потери информации, за исключением случая преобразования типа long int или unsigned long int к типу float, когда точность часто может быть потеряна. 2. Преобразование целых типов без знака. · Целое без знака преобразуется к более короткому целому без знака или со знаком путем усечения. · Целое без знака преобразуется к более длинному целому без знака или со знаком путем добавления нулей слева. · Целое без знака преобразуется к целому со знаком того же размера. Если взять для примера, unsigned short и short – числа в диапазоне от 32768 до 65535 превратятся в отрицательные. · Целое без знака преобразуется к плавающему типу. Сначала оно преобразуется к значению типа signed long, которое затем преобразуется в плавающий тип. 3. Преобразования плавающих типов. · Величины типа float преобразуются к типу double без изменения значения. · Величины double преобразуются к float c некоторой потерей точности, то есть, количества знаков после запятой. Если значение слишком велико для float, то происходит потеря значимости, о чем сообщается во время выполнения. · При преобразовании величины с плавающей точкой к целым типам она сначала преобразуется к типу long (дробная часть плавающей величины при этом отбрасывается), а затем величина типа long преобразуется к требуемому целому типу. Если значение слишком велико для long, то результат преобразования не определен. Обычно это означает, что на усмотрение компилятора может получиться любой «мусор». В реальной практике с такими преобразованиями обычно сталкиваться не приходится.
Дата добавления: 2014-01-07; Просмотров: 225; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |