Имеется следующий код:
int i = 2020202048;
i += 0.0f;
System.out.println(i);
Выводит:
2020201984
Почему?
Ответ
Проблема кроется в составном операторе присваивания +=. Согласно документации исходное выражение i += 0.0f; разворачивается в i = (int)(i + 0.0f);. Выражение в скобках будет иметь тип float, в котором исходное число 2020202048 не имеет точного представления и таким образом изменяется до 2020201984.0f, которое потом приводится снова к int
Неочевидность кода в вопросе в первую очередь обусловлена именно неявным преобразованием int → float → int (о чем уже упоминалось в комментариях к вопросу), которое происходит при использовании += с разными типами аргументов.
Комментариев нет:
Отправить комментарий