In C ++ Primer , автор Стэнли Б. Липпмана, в разделе «Неявные преобразования» говорится, что:
int ival;
unsigned int ui;
float fval;
fval = ui - ival * 1.0;
ival
преобразуется в double, затемумножается на 1.0
.Результат конвертируется в unsigned int
, затем вычитается ui
.Результат конвертируется в float
, затем присваивается fval
.
Но я так не думаю: я думаю, что на самом деле ival
конвертируется в удвоенную, а затем умножается на 1.0
затем ui
типа unsigned int
преобразуется в двойное значение, а не наоборот, и затем результат умножения вычитается из преобразованного в преобразованное в двойное значение ui
.наконец, преобразуйте это последнее двойное значение в число с плавающей точкой и присвойте его fval
.
Чтобы убедиться, что я говорю:
ival = 5;
ui = 10;
fval = 7.22f;
dval = 3.14;
std::cout << typeid(ui - ival * 1.0).name() << std::endl; // double
std::cout << (ui - ival * 1.7) << std::endl; // 1.5 this proves that the unsigned int ui is converted to double not the contrary that is because C++ preserves precision. otherwise the decimal part is truncated.