Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Консп_лекцій_Частина_1. Основи представлення с.doc
Скачиваний:
9
Добавлен:
06.11.2018
Размер:
839.68 Кб
Скачать

6.1.1. Арифметичне перетворення типів

Неявні арифметичні перетворення, як правило, здійснюються природнім шляхом. У загальному випадку, арифметичне перетворення приводить обидва операнди бінарного арифметичного виразу до одного типу, який і буде типом результату виразу. Існують два загальних правила:

  • Типи операндів завжди приводяться до того з типів, що здатний забезпечити найбільший діапазон значень при найбільшій точності. Це допомагає зменшити втрати точності при перетворенні.

  • Будь-який арифметичний вираз, що включає в себе цілі типів операндів, менші ніж і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-розрядних комп’ютерах.

На закінчення, ще раз наголосимо основну ідею: арифметичне перетворення типів ставить своєю метою зберегти точність при обчисленні. Це досягається шляхом приведення типів всіх операндів до найбільшого типу, здатному вмістити будь-яке значення кожного з присутніх у виразі операндів.