Будет ли дубль когда-либо неявно преобразовываться в беззнаковое целое в арифметических выражениях? - PullRequest
9 голосов
/ 11 марта 2019

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.

1 Ответ

8 голосов
/ 11 марта 2019

Ваше предположение верно, а книга неверна.

fval = ui - ival * 1.0;

можно переписать как

fval = ui - (ival * 1.0);

так что дает нам

float = unsigned - (int * double)

(int * double) становится double из-за обычных арифметических преобразований , дающих нам

float = unsigned - double

, который снова приводит к double, и мы присваиваем double переменной float.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...