Я новичок в Java, и мне интересно, как работает double to int cast? Я понимаю, что это просто и долго для int, взяв младшие 32 бита, но как насчет двойного (64 бита) до int (32 бита)? эти 64 бита из double в двоичном формате находятся в формате с плавающей запятой двойной точности (Mantissa), так как же он конвертируется в int внутренне?
Как работает double to int cast в Java
Ответы (3)
Все это задокументировано в разделе 5.1. 3 JLS.
На первом этапе число с плавающей запятой преобразуется либо в long, если T является длинным, либо в int, если T является byte, short, 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
.)
В большинстве случаев я ожидал, что это будет реализовано с использованием аппаратной поддержки - преобразование чисел с плавающей запятой в целые числа - это то, что обычно обрабатывается процессорами.
Java обрезает свое значение, если вы используете приведение (int), как вы могли заметить:
double d = 2.4d;
int i = (int) d;
System.out.println(i);
d = 2.6;
i = (int) d;
System.out.println(i);
Выход:
2
2
Если вы не используете Math.round, Math.ceil, Math.floor ...
Вы можете прочитать спецификацию Java:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3.
Соответствующий раздел - 5.1.3 - «Сужение примитивного преобразования».