В чем разница между
float f = (float) 99.32 ;
и
float f = 99.32f ;
Оба из них скомпилированы и успешно выполнены.
В чем разница между
float f = (float) 99.32 ;
и
float f = 99.32f ;
Оба из них скомпилированы и успешно выполнены.
float f = 99.32f ;
Это литерал float
, что означает, что переменная float присваивается непосредственно значением float
.
float f = (float) 99.32 ;
Это переменная float
, которой присваивается значение double
, которое передается в float
перед назначением.
Разница может быть оптимизирована, но в первом случае у вас есть двойной литерал, который является типом, отлитым от float, в то время как во втором случае вы имеете плавающий литерал.
Если вы не оптимизированы, вы получите код типа в коде во втором примере.
Однако есть угловые случаи, когда результат может (в зависимости от режима округления) быть немного иным. Если ваш номер не может быть точно представлен, вы в первом случае получите округление дважды - сначала, когда вы округлите десятичное представление до двойника, а затем, когда вы округлите его до плавающего, в то время как в первом случае вы округлите десятичное представление непосредственно к плавающей точке.
В первом случае без литой 99.32
интерпретируется как double не как float.
Двойной литерал выполняется для плавания.
Во втором случае у вас есть суффикс f
, чтобы убедиться, что компилятор рассматривает 99.32
как float.
В строке float f = (float) 99.32;
по умолчанию используется литерал 99.32
как тип double
, а затем передается в float
.
В строке float f = 99.32f ;
литерал создается как тип float
из-за конечного f
в 99.32f
и не требуется никакого литья типа.
Последний будет аналогичен написанию double f = 99.32;
, поскольку у вас будет тип double
, назначаемый непосредственно переменной типа соответствия.
Литералы с плавающей точкой без суффикса по умолчанию имеют тип double
.
Таким образом, указав float f = (float) 99.32;
, вы сначала произнесите явно литерал 99.32
, который имеет тип double
, на float
, а затем назначьте его переменной f
.
Указание float f = 99.32;
делает то же самое, но в этом случае преобразование между типами выполняется неявно.
Если вы хотите избежать неявного преобразования, вы должны использовать суффикс f
, чтобы определить ваш литерал (т.е. float f = 99.32f;
)
Разница в том, что литерал 99.32
имеет тип double, а литерал 99.32f
имеет тип float.
Первый оператор присваивает float-литералу переменной float. Ничего особенного.
Второй оператор выдает двойной литерал для float и присваивает результат переменной float.
Что касается стандарта, вы можете назначить двойной литерал для переменной float, не указывая явно ее самостоятельно. В этом случае происходит неявное литье. Например.
float f = 99.32;
Вы даже можете сделать:
float f = (double) 10.5f;
а правая сторона все еще неявно преобразуется в float.
Обратите внимание, что большинство современных компиляторов оптимизируют их, поэтому представление floats обычно имеет значение стиля и предпочтения. Просто быть последовательным.