Конверзија типова података

Сваки израз даје неку вредност чији тип зависи од типова чланова израза. Када су у неком изразу сви чланови истог типа, тада је и вредност израза тог типа.

    На пример:

  1. за декларацију: float y = 5, x = 2;
    израз y / x даје реалну вредност 2.5 јер су обе променљиве типа float,

  2. за декларацију: int y = 5, x = 2;
    израз y / x даје целобројну вредност 2 (одбацује се остатак дељењa) јер су обе променљиве типа int.

Врло често смо у ситуацији да изводимо аритметичке операције над подацима различитог типа (int, float), па је неопходно податке превести у одговарајући облик. Такође, додела вредности променљивој може се извршити само ако је вредност истог типа као променљива или се може превести у одговарајући тип.

    Превођење података из једног у други тип може се у програмском језику С# вршити аутоматски (имплицитна конверзија) или под контролом програмера (експлицитна конверзија).

Имплицитна конверзија

Разликујемо две ситуације у којима се примењује имплицитна конверзија:

• при израчунавању вредности израза компајлер аутоматски усклађује типове података који се користе у изразу, уколико је то могуће

• при додељивању вредности променљивој, вредност се аутоматски конвертује у тип променљиве уколико је то могуће

Основна идеја имплицитне конверзије је да се не губе информације и да се сачува прецизност података. Постоје правила конверзије по којима компајлер аутоматски извршава имплицитну конверзију.
Имплицитна конверзија се најчешће примењује код нумеричких типова података.

Променљива типа А, чији скуп могућих вредности је подскуп скупа могућих вредности типа Б, може се имплицитно конвертовати у тип Б.

Слика 5.5. Приказ имплицитне конверзије ужег у шири тип
(int у long, float, double или decimal)


    На слици 5.5 је приказана имплицитна конверзија помоћу две кофе, мање и веће, тако што све податке из мање кофе који су ужег типа (у овом случају int) можемо пребацити у већу кофу, односно у шири тип (long, float, double или decimal), без губитка података.

Слика 5.6. Табела дозвољених имплицитних конверзија

Пример 1. Израчунати вредност променљиве b након извршавања следећих наредби:


//Deklarisanje i inicijalizacija promenljive b
double b = 12.45;
//Deklarisanje promenljive x
int x = 10;
//Promenljivoj b dodeljujemo njenu vrednost uvecanu za vrednost x
b = b + x;

Пример 2. Израчунати вредности променљивих a, c, d након извршавања следећих наредби.


//Deklarisanje i inicijalizacija promenljivih
int  x = 15, y = 4, a;
double c, d, z = 15.0;
//Promenljivoj a dodeljujemo vrednost izraza x / y
a = x / y;
//Promenljivoj c dodeljujemo vrednost izraza x / y
c = x / y;
//Promenljivoj d dodeljujemo vrednost izraza z / y
d = z / y;



Експлицитна конверзија

Користи се код оних конверзија које се не могу имплицитно извршити. Експлицитном конверзијом програмер, додатним кодом, од компајлера захтева тражену конверзију.
Експлицитна конверзија се остварује коришћењем оператора cast или коришћењем класе Convert .
Оператор cast користимо тако што у заградама наведемо тип у који желимо да конвертујемо вредност израза који следи за оператором cast: (тип) променљива

Слика 5.7. Табела дозвољених експлицитних конверзија


Посматрајмо следеће наредбе:

//Deklarisanje promenljive a
int a;
//Deklarisanje i inicijalizacija promenljive b
double b = 12.78;
//Promenljivoj a dodeljujemo vrednost promenljive b
a = b;


При покушају превођења овог кода добијамо следећу поруку да је дошло до грешке:

Слика 5.8. Листа грешака које се јављају при извршавању наредби

То значи да се не може имплицитно конвертовати тип double у int.
Да би се остварила успешна додела вредности типа double променљивој типа int, неопходно је извршити експлицитну конверзију на следећи начин:
a = (int)b;

па претходне наредбе треба записати у следећем облику:

//Deklarisanje promenljive a
int a;
//Deklarisanje i inicijalizacija promenljive b
double b = 12.78;
//Promenljivoj a dodeljujemo vrednost promenljive b koja je eksplicitno konvertovana u int
a =(int) b;


По извршавању ових наредби неће доћи до грешке и променљива а сада добија вредност 12.
Можемо закључити да при конверзији података типа double (float, decimal) у тип int, долази до одбацивања децималног дела податка.

    Дакле, коришћењем експлицитне конверзије може доћи до губитка информација, односно до сужавања података, када је скуп вредности у који се податак конвертује подскуп скупа вредности податка који конвертујемо.
Може се конвертовати само нумерички, знаковни и набројиви тип.

Пример 3. Одредити вредности променљиве x након извршавања наредби:


//Deklarisanje i inicijalizacija promenljivih a i b
int a = 11, b = 4;
//Deklarisanje promenljivih x i y
double x, y;
//Promenljivoj x dodeljujemo vrednost izraza a / b
x = a / b;
//Promenljivoj y dodeljujemo vrednost izraza (double)a / b
y = (double)a / b;



    Ако бисмо покушали да преведемо наредни код:

//Deklarisanje i inicijalizacija promenljive x
int x = 212;
//Promenljivu x tipa int konvertujemo u tip string 
//operatorom cast i dodeljujemo tu vrednost promenljivoj s tipa string
string s = (string)x;
//Deklarisanje i inicijalizacija promenljive x
string p = ”123”;
//Promenljivu p tipa string konvertujemo u tip int 
//operatorom cast i dodeljujemo tu vrednost promenljivoj y tipa int
int y = (int)p;


добили бисмо извештај о следећим грешкама:

Слика 5.9. Листа грешака које се јављају при извршавању наредби


Што значи да наведене експлицитне конверзије није могуће извести оператором cast.
Наведене конверзије могуће је обавити коришћењем статичких метода класе Сonvert којима се подаци основног типа конвертују у други основни тип.
Сваки од метода конверзије позива се тако што се наводи име метода, а затим у заградама израз чија се вредност конвертује: Сonvert.ToInt32(x), Convert.ToDouble(y)...

    Коришћењем метода класе Сonvert претходни пример можемо записати на следећи начин:

//Deklarisanje i inicijalizacija promenljive x
int x = 212;
//Promenljivu x tipa int konvertujemo u tip string 
//metodom Convert.ToString() i dodeljujemo tu vrednost promenljivoj s tipa string
string s = Сonvert.ToString(x);
//Deklarisanje i inicijalizacija promenljive p
string p = ”123”;
//Promenljivu p tipa string konvertujemo u tip int 
//metodom Convert.ToInt32() i dodeljujemo tu vrednost promenljivoj y tipa int
int y = Сonvert.ToInt32(p);


Све структуре, којима су представљени основни типови података, садрже метод ToString() којим је омогућено превођење основног типа у string, па тако целобројну променљиву x можемо превести у string на следећи начин:
string s = х.ToString();

    Функције за експлицитну конверзију из класе Convert: ToBoolean, ToByte, ToChar, ToDecimal, ToDouble, ToInt16, ToInt32, ToInt64, ToSByte, ToSingle, ToString, ToUInt16, ToUInt32, ToUInt64.