Конверзије типова¶
Када се операције извршавају над операндима различитих типова, долази до
аутоматске конверзије типова где се операнди типова char и short увек
конвертују у тип int, па потом остали на основу хијерахије:
int < unsigned < long < unsigned long < float < double < long double
где се оператор нижег приоритета увек конвертује у оператор вишег. Мораш бити изузетно опрезан када вршиш операције над операндима различитих типова како не би добио нежељене непрецизне или нетачне резултате!
Напиши програм у програмском језику C у којем се сабирају вредности променљивих
int x = 'a' и char y = 3, па се резултат сабирања додељује променљивој
double z и вредност променљиве z исписује на стандардни излаз.
#include <stdio.h>
int main(void)
{
int x = 'a';
char y = 3;
double z = x + y;
printf("%lf", z);
return 0;
}
На стандардном излазу исписаће се:
100.000000
Зашто?
Карактер
'a'додељен је променљивојxтипаint. Иако је додељена вредност дефинисана као карактер, променљива је декларисана типомint, па је ASCII вредност97сачувана у променљивој типаint.Цео број
3додељен је променљивојyтипаchar. Иако је додељена вредност декларисана као број, променљива је декларисана типомchar, па је вредност3сачувана у променљивој типаchar.Израз
x + yдодељен је променљивојzтипаdouble. Пре него што је извршено сабирањеx + y, променљиваyконвертована је у типint. Потом је израчунат збир97 + 3, па је резултат100, који је типаint, конвертован у100.0типadoubleи додељен променљивојz.
Ако конверзију типова компајлер извршава аутоматски, као у претходном примеру, онда се таква конверзија назива имплицитна конверзија типова.
Напиши програм у програмском језику C у којем се деле вредности променљивих
int x = 'a' и char y = 3, па се резултат дељења додељује променљивој
double z и вредност променљиве z исписује на стандардни излаз.
#include <stdio.h>
int main(void)
{
int x = 'a';
char y = 3;
double z = x / y;
printf("%lf", z);
return 0;
}
На стандардном излазу исписаће се:
32.000000
Зашто је исписан резултат 32.000000, а не 32.333333, када је променљива z
типа double? Зато што су у тренутку дељења променљиве x и y биле типа
int, па је тако и резултат дељења 32. Тек је након операције дељења
извршена имплицитна конверзија резултата у double.
Присети се да се приликом дељења две целобројне вредности оператором /, као
резултат добија само цео део броја, док се разломљени део одбацује. Остатак
приликом целобројног дељења добија се оператором %.
Да ли је онда могуће у претходном примеру добити резултат у виду реалног броја
32.333333? Јесте, али експлицитном конверзијом типова.
Експлицитна конверзија типова, односно кастовање типова подразумева да
програмер сâм дефинише како ће се конверзија одвијати користећи каст операторе,
односно, наводећи жељени тип у заградама () испред израза.
#include <stdio.h>
int main(void)
{
int x = 'a';
char y = 3;
double z = (double)x / (double)y;
printf("%lf", z);
return 0;
}
На стандардном излазу сада ће се исписати:
32.333333
У овој верзији решења, пре него што је извршена операција дељења, променљиве
x и y кастоване су у тип double. Резултат дељења два реална броја типа
double биће типа double, у овом случају 32.333333. Да би се добио исти
резултат било је довољно кастовати само дељеник или само делилац из типа int
у тип double.