Присвоение целочисленного литерала двойной переменной в Java - PullRequest
5 голосов
/ 09 февраля 2012

Если я сделаю следующее

double d = 0;

, поскольку 0 - это целочисленный литерал, который использует 32 бита, а d - это двойная переменная, которая использует 64 бита, оставшиеся 32 бита будут заполнены случайным мусоромили Java правильно продвигает литерал?

Ответы [ 2 ]

10 голосов
/ 09 февраля 2012

Java продвигает его правильно, иначе был бы довольно большой объем кода, который был бы проблематичным: -)

Раздел 5.1.2 спецификации языка Java Подробнее:

Следующие 19 конкретных преобразований примитивных типов называются расширяющимися примитивными преобразованиями:

byte to short, int, long, float, or double
short to int, long, float, or double
char to int, long, float, or double
int to long, float, or double
long to float or double
float to double 

Расширяющиеся примитивные преобразования не теряют информацию об общей величине числового значения. Действительно, преобразования, расширяющиеся из целочисленного типа в другой целочисленный тип и из числа с плавающей точкой в ​​double, вообще не теряют никакой информации; числовое значение сохраняется точно. Преобразования, расширяющиеся из числа с плавающей точкой в ​​удвоение в выражениях строгого выражения, также точно сохраняют числовое значение; однако такие преобразования, которые не являются строгими, могут привести к потере информации об общей величине преобразованного значения.

Преобразование значения типа int или long в значение float, или значения long в удвоенное значение может привести к потере точности, то есть результат может потерять некоторые из младших значащих битов значения. В этом случае результирующее значение с плавающей запятой будет правильно округленной версией целочисленного значения с использованием режима округления до ближайшего стандарта IEEE 754.

Преобразование из 32-битной Java int в double (которая в Java имеет точность более 50 бит) не приведет к потере величины или любой точности. Если используемая вами константа принудительно устанавливается в long из-за ее значения, вы можете потерять точность, поскольку long имеет 64-битную точность.

1 голос
/ 09 февраля 2012

Java автоматически конвертирует double в integer.ie upcast
поэтому память автоматически управляется jvm.
но он не может автоматически привести удвоение к целому числу, т.е. downcast.

...