Я новичок в Java и задаюсь вопросом, как делать двойную работу? Я понимаю, что он довольно прост для int, беря низкие 32 бита, но как насчет двойных (64 бит) до int (32 бита)? эти 64 бита из двоичного двоичного файла в формате с плавающей запятой с двойной точностью (Mantissa), поэтому как он преобразуется в int внутри?
Как выполнить двойную работу в Java?
Ответ 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
.)
В большинстве случаев я ожидаю, что это будет реализовано с помощью аппаратной поддержки. Преобразование чисел с плавающей точкой в целые числа - это то, что обычно обрабатывается процессорами.
Ответ 2
Java усекает свое значение, если вы используете (int) cast, как вы можете заметить:
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...
Ответ 3
Вы можете прочитать спецификацию Java:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3
Соответствующий раздел - 5.1.3 - "Сужение примитивного преобразования".