Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція 3. Ядро мови С#.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
229 Кб
Скачать
☆

3.4. Перетворення вбудованих арифметичних типів-значень

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

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

Якщо неявного перетворення з одного типа в іншій не існує, програміст може задати явне перетворення типу за допомогою операції (тип) x.

Розрізняються:

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

Можливі варіанти перетворення типів

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

Всі арифметичні класи, у тому числі клас Int, мають перегружений статичний метод Parse, в якого першим обов'язковим параметром є рядок, що задає значення відповідного арифметичного типу в локалізованій формі. Форматом рядка і стилем її представлення можна управляти за допомогою інших параметрів методу Parse.

Ось приклад виклику цього методу для класів Int і Double.

Приклад 3.1.

// Перетворення типу з використанням методу Parse

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Parsing

{

class Program

{

static void Main(string[] args)

{

//method Parse

Console.WriteLine("Введіть ціле");

string strdata = Console.ReadLine();

int intdata = int.Parse(strdata);

Console.WriteLine("Введіть число з дробовою частиною і порядком");

strdata = Console.ReadLine();

double doubdata = double.Parse(strdata);

Console.WriteLine("intdata = {0}; doubdata = {1}",

intdata, doubdata);

Console.ReadKey();

}

}

}

Звужуюче перетворення - значення одного типу перетвориться до значення іншого типу, яке має менший розмір (з 64-розрядного в 32-розрядне).

Таке перетворення потенційно небезпечно втратою значення.

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

PositiveInfinity або NegativeInfinity.

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

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

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

Приклади явного і неявного перетворення типів

int x = 25;

long y = x; // неявне

short z = (short)x; // явне

double d = 3.141592536;

float f = (float)d; // явне

long l = (long)d; // явне

Система Common Type System середовища Microsoft .NET забезпечує безпечну типізацію, тобто гарантує відсутність побічних ефектів (переповнення оперативної пам'яті комп'ютера, некоректне перетворення типів і т.д.).