Конверзије типова¶
Када се операције извршавају над операндима различитих типова, долази до
аутоматске конверзије типова где се операнди типова 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
.