Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Samostoyatelnye_po_S.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
671.74 Кб
Скачать

Перерахування типів

Перерахування типу (type conversion) - перетворення значення змінної одного типу в значення іншого типу. Виділяють явне і неявне приведення типів.

При явному приведенні вказується тип змінної, до якого необхідно перетворити вихідну змінну.

При неявному приведенні перетворення відбувається автоматично, за правилами, закладеним у цьому мові програмування.

Само приведення відбувається як під час присвоювання значення змінної, так і при операціях порівняння, обчислення виразу. При використанні в виразі кілька різних типів значення одного або кількох підтипів може бути здійснене перетворення до більш загального типу (супертіп), з великим діапазоном можливих значень.

У мові C:

double d; / тип з плаваючою крапкою

long l; / / цілий тип

int i; / / цілий тип

if (d> i) d = i;

if (i> l) l = i;

if (d == l) d * = 2;

Кожного разу при виконанні операцій порівняння або присвоювання змінні різних типів будуть приведені до єдиного типу. Слід з обережністю використовувати неявне приведення типу. При перекладі числа з речовинного типу в цілочисельний, дробова частина відсікається. Зворотне приведення з цілочисельного типу до вещественному також може привести до пониження точності, що пов'язано з різним поданням речових і цілочисельних чисел на машинному рівні. Наприклад, речовинний тип single стандарту IEEE 754 не може точно уявити число 16777217, в той час як 32-бітовий цілочисельний тип може. Це може призвести до ситуацій, коли порівняння на рівність одного і того ж числа, представленого типами (int і single) буде видавати помилковий результат (числа не рівні один одному).

Перетворення типів

При виконанні операцій відбуваються неявні перетворення типів в наступних випадках:

- При виконанні операцій здійснюються звичайні арифметичні перетворення (які були розглянуті вище);

- При виконанні операцій присвоювання, якщо значення одного типу присвоюється змінної іншого типу;

- При передачі аргументів функції.

Крім того, в Сі є можливість явного приведення значення одного типу до іншого.

В операціях присвоювання тип значення, що присвоюється, перетвориться до типу змінної, яка отримує це значення. Допускається перетворення цілих і плаваючих типів, навіть якщо таке перетворення веде до втрати інформації.

Перетворення цілих типів зі знаком. Ціле зі знаком перетвориться до більш короткого цілого зі знаком, за допомогою усікання старших бітів. Ціла зі знаком перетвориться до більш довгому цілого зі знаком, шляхом розмноження знака. При перетворенні цілого зі знаком до цілого без знака, ціле зі знаком перетвориться до розміру цілого без знака і результат розглядається як значення без знака.

Перетворення цілого зі знаком до плаваючого типу відбувається без втрати інформації, за винятком випадку перетворення значення типу long int або unsigned long int до типу float, коли точність часто може бути втрачена.

Перетворення цілих типів без знака. Ціле без знаку перетвориться до більш короткого цілого без знака або із знаком шляхом усічення старших бітів. Ціле без знаку перетвориться до більш довгому цілого без знака або із знаком шляхом доповнення нулів зліва. Коли ціле без знаку перетвориться до цілого зі знаком того ж розміру, бітове представлення не змінюється. Тому значення, яке воно представляє, змінюється, якщо знаковий біт встановлено (дорівнює 1), тобто коли вихідне ціле без знака більше ніж максимальне позитивне ціле зі знаком, такої ж довжини.

Цілі значення без знака перетворюються до плаваючого типу, шляхом перетворення цілого без знака до значення типу signed long, а потім значення signed long перетвориться в плаваючий тип. Перетворення з unsigned long до типу float, double або long double виробляються з втратою інформації, якщо значення, яке більше, ніж максимальне позитивне значення, яке може бути представлене для типу long.

Перетворення плаваючих типів. Величини типу float перетворюються до типу double без зміни значення. Величини double і long double перетворюються до float c деякою втратою точності. Якщо значення дуже велике для float, то відбувається втрата значущості, про що повідомляється під час виконання.

При перетворенні величини з плаваючою точкою до цілих типів вона спочатку перетворюється до типу long (дробова частина плаваючою величини при цьому відкидається), а потім величина типу long перетвориться до необхідного цілого типу. Якщо значення дуже велике для long, то результат перетворення не визначений.

Перетворення з float, double або long double до типу unsigned long проводиться з втратою точності, якщо значення, яке більше, ніж максимально можливе позитивне значення, представлене типом long.

Перетворення типів покажчика. Покажчик на величину одного типу може бути перетворений до покажчика на величину іншого типу. Однак результат може бути не визначений через відмінностей у вимогах до вирівнювання і розмірах для різних типів.

Покажчик на тип void може бути перетворений до покажчика на будь-який тип, і покажчик на будь-який тип може бути перетворений до покажчика на тип void без обмежень. Значення покажчика може бути перетворено до цілої величини. Метод перетворення залежить від розміру покажчика та розміру цілого типу наступним чином:

- Якщо розмір покажчика менше розміру цілого типу або дорівнює йому, то покажчик перетвориться так само, як ціле без знаку;

- Якщо покажчик більше, ніж розмір цілого типу, то покажчик спочатку перетвориться до вказівником з тим же розміром, що і цілий тип, і потім перетвориться до цілого типу.

Цілий тип може бути перетворений до адресного типу за наступними правилами:

- Якщо цілий тип того ж розміру, що і покажчик, то ціла величина просто розглядається як покажчик (ціле без знаку);

- Якщо розмір цілого типу відмінний від розміру покажчика, то цілий тип спочатку перетвориться до розміру покажчика (використовуються способи перетворення, описані вище), а потім отримане значення трактується як покажчик.

Перетворення при виклику функції. Перетворення, що виконуються над аргументами при виклику функції, залежать від того, чи був заданий Якщо задано прототип функції і він включає оголошення типів аргументів, то над аргументами у виклику функції виконуються тільки звичайні арифметичні перетворення.

Ці перетворення виконуються незалежно для кожного аргументу. Величини типу float перетворяться до double, величини типу char і short перетворяться до int, величини типів unsigned char і unsigned short перетворяться до unsigned int. Можуть бути також виконані неявні перетворення змінних типу вказівник. Ставлячи прототипи функцій, можна перевизначити ці неявні перетворення і дозволити компілятору виконати контроль типів.

Перетворення при приведенні типів. Явне перетворення типів може бути здійснене за допомогою операції приведення типів, яка має формат:

(Ім'я-типу) операнд.

У наведеній записи ім'я-типу задає тип, до якого повинен бути перетворений операнд.

приклад:

int i = 2;

Питання для контролю:

            1. Що таке перерахування типів?

            2. Що таке перетворення типів?

            3. Які типи данних можна використовувати при перерахуванні?

Література:

1. Шпак З.Я. Програмування мовою С: Навчальний посібник. Львів: Оріяна-Нова, 2006. - 432 с –Стор 77-81

Урок №6

(згідно робочої навчальної програми)

Тема: Циклічні програми

Питання:

1.Оператори циклу

2. Оператор while

3. Оператор for

4. Оператор do-while

5. Оператори переходу

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]