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



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



float f = (float) 99.32 ;


и



float f = 99.32f ;


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

699   6  

6 ответов:

float f = 99.32f ;

что это float литерал, что означает, что переменной с плавающей точкой присваивается значение float значение напрямую.

float f = (float) 99.32 ;

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

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

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

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

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

двойной литерал приводится к плаванию.

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

в строке 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 f = 99.32;

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

float f = (double) 10.5f;

и правая сторона все еще неявно преобразуется в поплавок.

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

Comments

    Ничего не найдено.