КАТЕГОРИИ: Архитектура-(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) |
Арифметичне перетворення типів
Неявне перетворення типів Мова програмування С++ встановлює набір стандартних перетворень між об’єктами різних вбудованих типів, що неявно виконуються компілятором в таких випадках: 1) Використання в арифметичному виразі операндів з різними типами. У цьому випадку типи всіх операндів приводяться до типу одного операнда, розмір якого є найбільшим (це називається арифметичним перетворенням), наприклад: int ix = 1; double dx = 5.74; if ix + dx {…}; // змінна ix перетворюється в тип double зі значенням 1.0 2) Присвоювання значення виразу одного типу об’єкту іншого типу. У цьому випадку результуючим буде тип об’єкта, якому присвоюється значення, наприклад: ix = dx; // dx зі значенням 5.74 перетворюється в int зі значенням 5 3) Передача функції аргумента, тип якого відрізняється від типу відповідного формального параметра. У цьому випадку тип фактичного аргумента приводиться до типу формального параметра, наприклад: extern double sqrt(double); cout << "Квадратний корінь з 2 = " << sqrt(2); // 2 перетворюється в double 2.0 4) Повернення з функції значення, тип якого не співпадає з типом результату, заданим в оголошенні функції. У цьому випадку тип значення, що фактично повертається, приводиться до оголошеного, наприклад: double fun (int ix1, int ix2){ return ix1 – ix2; // результат перетворюється в double }
Неявні арифметичні перетворення, як правило, здійснюються природнім шляхом. У загальному випадку, арифметичне перетворення приводить обидва операнди бінарного арифметичного виразу до одного типу, який і буде типом результату виразу. Існують два загальних правила: · Типи операндів завжди приводяться до того з типів, що здатний забезпечити найбільший діапазон значень при найбільшій точності. Це допомагає зменшити втрати точності при перетворенні. · Будь-який арифметичний вираз, що включає в себе цілі типів операндів, менші ніж іnt, перед обчисленням завжди перетворює їх в іnt. Сформулюємо більш точно ієрархію правил перетворень починаючи з найбільшого типу long double. Ці правила називаються звичайними арифметичними перетвореннями: · Якщо будь-який з операндів має тип long double, то й інший приводиться до long double. · У противному випадку, якщо будь-який з операндів має тип double, то й інший приводиться до double. · У противному випадку, якщо будь-який з операндів має тип float, то й інший приводиться до float.
· У противному випадку для обох операндів здійснюється цілочисельне підвищення, а саме якщо один з операндів має тип unsіgned long іnt, то й інший перетвориться в unsіgned long іnt. · У противному випадку, якщо один з операндів належить типові long іnt, а інший - unsіgned іnt, то результат залежить від того, чи покриває long іnt всі значення unsіgned іnt, і якщо це так, то unsіgned іnt приводиться до long іnt; якщо ні, то обидва операнди перетворяться в unsіgned long іnt. · У противному випадку, якщо один з операндів має тип long іnt, то й інший приводиться до long іnt. · У противному випадку, якщо один з операндів має тип unsіgned іnt, то й інший приводиться до unsіgned іnt. · У противному випадку обидва операнди мають тип іnt.
Приклад 13. Нехай задано такі оголошення: int ix; char cх; bool bx; long lx; unsigned long ulx; unsigned int uix; float fx; double dx; Розглянемо вирази: 1). 3.14159L + 'a' Символьна константа 'a' (значення 97 за таблицею ASCII) приводиться до long double і потім додається до літерала 3.14159L того ж типу. 2). dx + fх + ix В цьому прикладі змінні fх і iх перетворюються в double перед додаванням. 3). cх + fх + ix; В даному випадку намає операндів типу double і long double, але є операнд типу float, тип решти операндів змінюється на float. 4). Якщо у виразі намає дійсних операндів, то всі вони являють собою цілі типи. Перш ніж визначити тип результату, виконується перетворення, яке називається приведенням до цілого: всі операнди з типами меньшими, ніж int, заміняються на int. Наприклад: enum status { bad, ok }; В цьому переліку значення елементів рівні 0 і 1. Обидва ці значення можуть бути представлені типом char, значить char і має стати типом внутрішнього представлення даного переліку. Приведення до цілого типу перетворює char в int. 5). При приведені до цілого типи char, signed char, unsigned char та short int перетворюються в int. Тип unsigned short int трансформується в int, якщо даного типу достатньо для представлення всього діапазону значень unsigned short int (зазвичай це відбувається в системах, які відводять півслова під short та ціле слово під int), в іншому випадку unsigned short int замінюється на unsigned int. Наприклад, в наступному виразі: cx + ulx перед визначенням типу результату змінна cх перетворюється в тип int. Після приведення до цілого порівнюються типи операндів. Один із них має тип unsigned long, отже інший буде також цього типу. 6). cx + uix + 1024 + lx В цьому прикладі змінна cх, змінна uix і константа 1024 перетворюються в long перед додаванням. Як зазначалось вище, з цього правила існує одне виключення: перетворення unsigned int в long відбувається тільки в тому випадку, якщо тип long здатний вмістити весь діапазон значень unsigned int. Зазвичає це не так в 32-бітних системах, де і long, і int представляються одним машинним словом. Якщо ж тип long не здатний представити весь діапазон unsigned int, тоді обидва операнди зводяться до типу unsigned long. Отже, цей арифметичний вираз буде мати тип unsigned long на 32-розрядних комп’ютерах. На закінчення, ще раз наголосимо основну ідею: арифметичне перетворення типів ставить своєю метою зберегти точність при обчисленні. Це досягається шляхом приведення типів всіх операндів до найбільшого типу, здатному вмістити будь-яке значення кожного з присутніх у виразі операндів.
Дата добавления: 2014-01-05; Просмотров: 586; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |