Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЕМА 4. ТИПИ ДАНИХ ТА ЗМІННІ..docx
Скачиваний:
5
Добавлен:
22.11.2019
Размер:
146.77 Кб
Скачать

5. Приведення типів даних.

Приведення типів - один з аспектів безпеки мови.

Використовувані в програмі типи характеризуються власними діапазонами значень, які визначаються властивостями типів, - у тому числі і розміром області пам'яті, призначеної для кодування значень відповідного типу. При цьому області значень різних типів перетинаються. Багато значень можна виразити більш ніж одним типом. Наприклад, значення 4 можна представити як значення типа sbyte, byte, short, ushort, int, uint, long, ulong. При цьому в програмі все повинно бути влаштовано так, щоб логіка перетворення значень одного типу до іншого типу була зрозумілою, а результати цих перетворень - передбачувані.

Інколи приведення значення до іншого типа відбувається автоматично. Такі перетворення називаються неявними.

Але у ряді випадків перетворення вимагає додаткової уваги з боку програміста, який повинен явним чином вказувати необхідність перетворення, використовуючи вирази приведення типа або звертаючись до спеціальних методів перетворення, визначеним в класі System.Convert, які забезпечують перетворення значення одного типа до значення іншого.

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

Розрізняють розширене та звужуюче перетворення:

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

Можливість розширеного перетворення представлено у таблиці нижче.

Таблиця 7

Можливість розширеного перетворення типів даних

Тип, що перетворюється

У який тип перетворюється

Byte

UInt16, Int16, UInt32, Int32, UInt64, Int64, Single, Double, Decimal

SByte

Int16, Int32, Int64, Single, Double, Decimal

Int16

Int32, Int64, Single, Double, Decimal

UInt16

UInt32, Int32, UInt64, Int64, Single, Double, Decimal

Char

UInt16, UInt32, Int32, UInt64, Int64, Single, Double, Decimal

Int32

Int64, Double, Decimal

UInt32

Int64, Double, Decimal

Int64

Decimal

UInt64

Decimal

Single

Double

Звужуюче перетворення - значення одного типу перетвориться до значення іншого типа, яке має менший розмір (з 64-розрядного в 32-розрядне). Таке перетворення потенційне небезпечно втратою значення. Звужуючі перетворення можуть призводити до втрати інформації. Якщо тип, до якого здійснюється перетворення, не може правильно передати значення джерела, то результат перетворення виявляється дорівнює константі PositiveInfinity або NegativeInfinity.При цьому значення PositiveInfinity інтерпретується як результат ділення додатнього числа на нуль, а значення NegativeInfinity - як результат ділення відємного числа на нуль. Якщо звужуюче перетворення забезпечується методами класу System.Convert, то втрата інформації супроводиться генерацією виключення (про виключення пізніше).

Таблиця 8

Можливість звужуючого перетворення типів даних

Тип, що перетворюється

У який тип перетворюється

Byte

Sbyte

SByte

Byte, UInt16, UInt32, UInt64

Int16

Byte, SByte, UInt16

UInt16

Byte, SByte, Int16

Int32

Byte, SByte, Int16, UInt16, UInt32

UInt32

Byte, SByte, Int16, UInt16, Int32

Int64

Byte, SByte, Int16, UInt16, Int32, UInt32, UInt64

UInt64

Byte, SByte, Int16, UInt16, Int32, UInt32, Int64

Decimal

Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64

Single

Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64

Double

Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt6

Приклад 10. Звужуюче перетворення.

1: public static void Main()

2: {

3: int i = 1234567;

4: short s = (short)i;

5: Console.WriteLine("int - {0}\n short - {1}", i,s);

6: }

Рис. 2. Результат виконання прикладу 10.