2015-06-27 2 views
5
char c1 = 123; //Compiles fine 
char c2 = 123456; //Error: cannot convert from int to char 

Java достаточно умен, чтобы определить, достаточно ли целого числа для преобразования в символ. Почему он не способен преобразовать очень маленькие литералы с плавающей запятой в float ?. Например:char c = некоторый целочисленный литерал может скомпилировать, но float f = некоторый литерал с плавающей запятой никогда не будет компилироваться. Зачем?

float f1 = 0.3; //Error: cannot convert from double to float 
float f2 = 0.3f; //Compiles fine 

полукокс с = некоторыми целым числом буквальным может составить, но всплывает п = некоторые с плавающей точкой буквальной никогда не компилировать. Зачем?

PS: Я знаю, что с плавающей точкой буквальной рассматривается как двойные по умолчанию

+0

Возможный дубликат [Java: зачем вам нужно указывать «f» в потоковом литерале?] (Http://stackoverflow.com/questions/14102955/java-why-do-you-need- to-define-af-in-a-float-literal) – RealSkeptic

+0

Мой вопрос не о символах 'f' в литералах с плавающей точкой. Речь идет о том, как больший тип данных преобразуется в меньший тип данных без каких-либо проблем в одном случае (int to char, 32 бит до 16 бит), в то время как он дает ошибку компиляции в другом случае (double to float, от 64 до 32 бит). Литерал достаточно мал, чтобы соответствовать переменной float, так же как int был маленьким достаточно, чтобы соответствовать char. @ RealSkeptic –

+0

Ответ тем не менее в этом вопросе - лучший ответ не принят. – RealSkeptic

ответ

7

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

С другой стороны, если вы назначаете переменной char переменную int внутри диапазона типа char (например, 123), то нет потери данных.

Оба назначения (переменная int для переменной char и double to float variable) требуют narrowing primitive conversion.

JLS 5.2 говорит

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

+3

Я бы добавил, что '0.3' не может быть точно представлен в двоичной плавающей точке w ith * любой * уровень точности. –

+1

Целое число, независимо от того, насколько оно мало, всегда будет представлено 32 битами, в то время как символ представлен 16 битами. Так что же здесь нет возможной потери точности ?. Точно так же, как в случае поплавков и парных? –

+1

@PiyushSaravagi См. Цитату, которую я добавил из JLS. Любое int между 0 и 2^16-1 может быть присвоено переменной char без какой-либо потери информации, так как верхние 16 бит int будут содержать 0, чтобы они могли быть отброшены без потери какой-либо информации. – Eran