
- •Конспект лекцій ( частина і ) з дисципліни
- •1. Поняття інформації та основні форми її подання
- •2. Представлення даних в пам’яті комп'ютера
- •3. Класифікація типів даних
- •4. Базові типи даних
- •4.1. Порожній тип
- •4.2. Логічний тип даних
- •4.3. Символьні типи даних
- •4.4. Цілочисельні типи даних
- •4.5. Дійсні типи даних
- •5. Похідні типи даних
- •5.1. Переліки
- •5.2. Вказівники
- •5.3. Посилання
- •5.4. Масиви
- •5.5. Структури
- •5.6. Бітові поля
- •5.7. Об'єднання
- •6. Перетворення типів
- •6.1. Неявне перетворення типів
- •6.1.1. Арифметичне перетворення типів
- •6.1.2. Перетворення типів при присвоюванні
- •6.2. Явне перетворення типів
- •6.3. Застаріла форма явного перетворення
- •Список літератури
- •1. Поняття інформації та основні форми її подання ------------------------------------------- 3
- •Основи представлення данних в пам'яті комп'ютера
- •6.050102 “Комп’ютерна інженерія
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-розрядних комп’ютерах.
На закінчення, ще раз наголосимо основну ідею: арифметичне перетворення типів ставить своєю метою зберегти точність при обчисленні. Це досягається шляхом приведення типів всіх операндів до найбільшого типу, здатному вмістити будь-яке значення кожного з присутніх у виразі операндів.