char c = 一些整数文字可能会编译,但 float f = 一些浮点文字永远不会编译。为什么?
char c = some integer literal might compile but float f = some floating point literal will never compile. Why?
char c1 = 123; //Compiles fine
char c2 = 123456; //Error: cannot convert from int to char
Java 足够聪明,可以判断整数是否小到可以转换为字符。为什么它不能将非常小的浮点文字转换为浮点数?。例如:
float f1 = 0.3; //Error: cannot convert from double to float
float f2 = 0.3f; //Compiles fine
char c = 一些整数文字可能会编译,但 float f = 一些浮点文字永远不会编译。为什么?
PS:我知道默认情况下浮点文字被视为双精度
0.3
被视为双精度数,因此它的二进制表示形式需要 64 位,并且在不损失精度的情况下无法放入浮点数,因此您不能将其分配给浮点数变量显式转换。
另一方面,如果您将 char 类型范围内的 int 文字(例如 123)分配给 char 变量,则不会丢失数据。
两个赋值(int 到 char 变量和 double 到 float 变量)都需要 narrowing primitive conversion.
JLS 5.2 说
A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable.
char c1 = 123; //Compiles fine
char c2 = 123456; //Error: cannot convert from int to char
Java 足够聪明,可以判断整数是否小到可以转换为字符。为什么它不能将非常小的浮点文字转换为浮点数?。例如:
float f1 = 0.3; //Error: cannot convert from double to float
float f2 = 0.3f; //Compiles fine
char c = 一些整数文字可能会编译,但 float f = 一些浮点文字永远不会编译。为什么?
PS:我知道默认情况下浮点文字被视为双精度
0.3
被视为双精度数,因此它的二进制表示形式需要 64 位,并且在不损失精度的情况下无法放入浮点数,因此您不能将其分配给浮点数变量显式转换。
另一方面,如果您将 char 类型范围内的 int 文字(例如 123)分配给 char 变量,则不会丢失数据。
两个赋值(int 到 char 变量和 double 到 float 变量)都需要 narrowing primitive conversion.
JLS 5.2 说
A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable.