Ответ 1
Все это описано в раздел 5.1.3 JLS.
На первом этапе число с плавающей запятой преобразуется либо в long, если T long, либо в int, если T является байтом, коротким, char или int следующим образом:
Если число с плавающей запятой является NaN (п. 4.2.3), результатом первого шага преобразования является int или long 0.
В противном случае, если число с плавающей запятой не является бесконечностью, значение с плавающей запятой округляется до целочисленного значения V, округляя к нулю с использованием режима округления к нулю (IEEE 754) (§4.2.3), Тогда есть два случая:
Если T длинно, и это целочисленное значение может быть представлено как длинное, то результатом первого шага является длинное значение V.
В противном случае, если это целочисленное значение может быть представлено как int, то результатом первого шага является значение int V.
В противном случае должен выполняться один из следующих двух случаев:
Значение должно быть слишком маленьким (отрицательное значение большой величины или отрицательной бесконечности), а результат первого шага - наименьшее представимое значение типа int или long.
Значение должно быть слишком большим (положительное значение большой величины или положительной бесконечности), а результатом первого шага является наибольшее представимое значение типа int или long.
(Второй шаг здесь не имеет значения, когда T
есть int
.)
В большинстве случаев я ожидаю, что это будет реализовано с помощью аппаратной поддержки. Преобразование чисел с плавающей точкой в целые числа - это то, что обычно обрабатывается процессорами.