Студопедия

КАТЕГОРИИ:


Архитектура-(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; Просмотров: 568; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.017 сек.