В чем разница между кастом в `float` и добавлением` f` в качестве суффикса при инициализации `float`?

В чем разница между

float f = (float) 99.32 ;

и

float f = 99.32f ;

Оба из них скомпилированы и успешно выполнены.

Ответ 1

float f = 99.32f ;

Это литерал float, что означает, что переменная float присваивается непосредственно значением float.

float f = (float) 99.32 ;

Это переменная float, которой присваивается значение double, которое передается в float перед назначением.

Ответ 2

Разница может быть оптимизирована, но в первом случае у вас есть двойной литерал, который является типом, отлитым от float, в то время как во втором случае вы имеете плавающий литерал.

Если вы не оптимизированы, вы получите код типа в коде во втором примере.

Однако есть угловые случаи, когда результат может (в зависимости от режима округления) быть немного иным. Если ваш номер не может быть точно представлен, вы в первом случае получите округление дважды - сначала, когда вы округлите десятичное представление до двойника, а затем, когда вы округлите его до плавающего, в то время как в первом случае вы округлите десятичное представление непосредственно к плавающей точке.

Ответ 3

В первом случае без литой 99.32 интерпретируется как double не как float.

Двойной литерал выполняется для плавания.

Во втором случае у вас есть суффикс f, чтобы убедиться, что компилятор рассматривает 99.32 как float.

Ответ 4

В строке float f = (float) 99.32; по умолчанию используется литерал 99.32 как тип double, а затем передается в float.

В строке float f = 99.32f ; литерал создается как тип float из-за конечного f в 99.32f и не требуется никакого литья типа.

Последний будет аналогичен написанию double f = 99.32;, поскольку у вас будет тип double, назначаемый непосредственно переменной типа соответствия.

Ответ 5

Литералы с плавающей точкой без суффикса по умолчанию имеют тип double.

Таким образом, указав float f = (float) 99.32;, вы сначала произнесите явно литерал 99.32, который имеет тип double, на float, а затем назначьте его переменной f.

Указание float f = 99.32; делает то же самое, но в этом случае преобразование между типами выполняется неявно.

Если вы хотите избежать неявного преобразования, вы должны использовать суффикс f, чтобы определить ваш литерал (т.е. float f = 99.32f;)

Ответ 6

Разница в том, что литерал 99.32 имеет тип double, а литерал 99.32f имеет тип float.

Первый оператор присваивает float-литералу переменной float. Ничего особенного.

Второй оператор выдает двойной литерал для float и присваивает результат переменной float.

Что касается стандарта, вы можете назначить двойной литерал для переменной float, не указывая явно ее самостоятельно. В этом случае происходит неявное литье. Например.

float f = 99.32;

Вы даже можете сделать:

float f = (double) 10.5f;

а правая сторона все еще неявно преобразуется в float.

Обратите внимание, что большинство современных компиляторов оптимизируют их, поэтому представление floats обычно имеет значение стиля и предпочтения. Просто быть последовательным.