Преобразование типов

Задания раздела 4.11.1
4.34. C учетом определений переменных данного раздела объясните, какие преобразования имеют место в следующих выражениях:
(a) if (fval)
(b) dval=fval+ival;
(c) dval+ival*cval;
Помните, что возможно придется учитывать порядок операторов
4.35. С учетом определений
char cval;
int ival;
unsigned int ui;
float fval;
double dval;
укажите неявные преобразования типов, если таковые вообще имеются.
(a) cval='a'+3;
(b) fval=ui-ival*1.0;
(c) dval=ui*fval;
(d) cval=ival+fval+dval;

4.11.1


Немного правил преобразования.
1. Если в преобразовании задействованы типы меньшие, чем тип int, то они приводятся к типу большему целочисленному.
2. В условиях не логические выражения преобразовываются в тип bool.
3. При инициализации инициализатор преобразуется в тип переменной; при присвоении правый операнд преобразуется в тип левого.
4. В арифметических выражениях и выражениях отношения с операндами смешанных типов происходит преобразование в самый большой общий тип.
5. Преобразования происходят также при вызове функций.

Типы bool, char, signed char, unsigned char, short и unsigned short преобразуются в int, если значение соответствует ему, а в противном случае оно преобразуется в тип unsigned int.
БОльшие символьные типы (wchar_t, char16_t, char32_t) преобразуются в наименьший целочисленный тип int, unsigned int, long, unsigned long, long long, которому соответствуют все возможные значения этого символьного типа.

Если операнды оператора имеют разные типы, они обычно преобразуются в общий тип. Если любой из операндов имеет беззнаковый тип, то тип, в который преобразуются операнды, зависит от относительных размеров целочисленных типов на машине.
Сначала осуществляются целочисленные преобразования. Если полученные в результате типы совпадают, то никаких больше преобразований не происходит. Если оба операнда (преобразованных или нет) имеют одинаковый знак, то операнд с меньшим типом преобразуется в больший тип.
При разных знаках, если тип беззнакового операнда больший, чем у знакового операнда, знаковый операнд преобразуется в беззнаковый. Например при преобразовании типов unsigned int и int происходит преобразование в тип unsigned int (потому что он больше из-за отсутствия бита, отвечающего за знак операнда - моё мнение). Если значение типа int отрицательное, то при приведении типов результат преобразуется как было написано ранее в первой теме про преобразование - с переполнением.
Если тип знакового операнда больше беззнакового, то операнд беззнакового типа преобразуется в знаковый.

Преобразования на примерах:
bool flag; char cval; short sval; unsigned short usval;
int ival; unsigned int uival; lonf lval; unsigned long ulval;
float fval; double dval;
3.14159L +'a'; // 'a' преобразуется в int, а затем в long double
dval+ival; // ival преобразуется в double
dval+fval; // fval преобразуется в double
ival=dval; // dval преобразуется в int (с усечением)
flag=dval; // если dval - 0, flag - false, в противном случае - true
cval+fval; // cval преобразуется в int, а затем int во float
sval+cval; // sval и cval преобразуются в int
cval+lval; // cval преобразуется в long
ival+ulval; // ival преобразуется в unsigned long
usval+ival; /* преобразование зависит от соотношения размеров типов unsigned short и int */
uival+lval; /* преобразование зависит от соотношения размеров типов unsigned int и long */

4.34. C учетом определений переменных данного раздела объясните, какие преобразования имеют место в следующих выражениях:
(a) if (fval)
(b) dval=fval+ival;
(c) dval+ival*cval;
Помните, что возможно придется учитывать порядок операторов

(a) if (fval) // преобразование в bool
(b) dval=fval+ival; // int во float а потом в double
(c) dval+ival*cval; // char в int потом int в double

4.35. С учетом определений, укажите неявные преобразования типов, если таковые вообще имеются.
char cval;
int ival;
unsigned int ui;
float fval;
double dval;
(a) cval='a'+3;
(b) fval=ui-ival*1.0;
(c) dval=ui*fval;
(d) cval=ival+fval+dval;

(a) cval='a'+3; // char в int, результат в char
(b) fval=ui-ival*1.0; // int в double, unsigned int в double c усечением во float
(c) dval=ui*fval; // unsigned int во float, float в double
(d) cval=ival+fval+dval; //  int во float, float в double, double в char

Добавить комментарий