Java向下广播转换

Java向下广播转换,java,types,casting,Java,Types,Casting,为什么char c=65起作用而不抛出错误,而float d=65.0起作用而抛出静态错误:赋值类型错误:从double到float?他们不是都很沮丧吗 我可以引用一些文章,然后说“它是这样工作的,因为语言规范这么说的”,但这并不能令人满意,不是吗 我有根据地猜测,为什么设计了这样的语言: 当将65转换为char时,您真正要做的是去掉二进制表示中的一堆无关紧要的0,因为char是16位,而int是32位。就像从0065年到65年 另一方面,65.0是一个double,以一种格式表示。请注意,通常

为什么char c=65起作用而不抛出错误,而float d=65.0起作用而抛出静态错误:赋值类型错误:从double到float?他们不是都很沮丧吗

我可以引用一些文章,然后说“它是这样工作的,因为语言规范这么说的”,但这并不能令人满意,不是吗

我有根据地猜测,为什么设计了这样的语言:

当将
65
转换为
char
时,您真正要做的是去掉二进制表示中的一堆无关紧要的0,因为
char
是16位,而
int
是32位。就像从0065年到65年

另一方面,
65.0
是一个
double
,以一种格式表示。请注意,通常情况下,此表示仅为真实值的近似值。有关更多信息,请参阅。位数越多,逼近效果越好。因此,从双精度(64位)到浮点型(32位)的转换类似于将0.333333转换为0.333。希望你会同意,这是一个更大的信息损失比转向0065至65。因此,这不是应该自动执行的转换。程序员需要意识到这正在发生


无论如何,为了完整起见,这里是语言规范的相关部分:

分配上下文允许使用以下内容之一:

此外,如果表达式是
byte
short
char
int
类型的常量表达式(§15.28):

  • 如果变量的类型是byte、short或char,并且常量表达式的值可以在变量的类型中表示,则可以使用窄化原语转换
因此,语言规范对byte、short、char和int进行了特殊处理,允许它们在赋值上下文中进行窄化转换。请注意,表达式必须为:

  • a
  • 在目标类型的范围内,因此
    char x=100000无效
我可以引用一些文章,然后说“它是这样工作的,因为语言规范这么说的”,但这并不能令人满意,不是吗

我有根据地猜测,为什么设计了这样的语言:

当将
65
转换为
char
时,您真正要做的是去掉二进制表示中的一堆无关紧要的0,因为
char
是16位,而
int
是32位。就像从0065年到65年

另一方面,
65.0
是一个
double
,以一种格式表示。请注意,通常情况下,此表示仅为真实值的近似值。有关更多信息,请参阅。位数越多,逼近效果越好。因此,从双精度(64位)到浮点型(32位)的转换类似于将0.333333转换为0.333。希望你会同意,这是一个更大的信息损失比转向0065至65。因此,这不是应该自动执行的转换。程序员需要意识到这正在发生


无论如何,为了完整起见,这里是语言规范的相关部分:

分配上下文允许使用以下内容之一:

此外,如果表达式是
byte
short
char
int
类型的常量表达式(§15.28):

  • 如果变量的类型是byte、short或char,并且常量表达式的值可以在变量的类型中表示,则可以使用窄化原语转换
因此,语言规范对byte、short、char和int进行了特殊处理,允许它们在赋值上下文中进行窄化转换。请注意,表达式必须为:

  • a
  • 在目标类型的范围内,因此
    char x=100000无效

65.0
在Java意义上是双重的,因为
。如果你想让这个数字成为浮点数,只需在后面加上
f


float d=65.0f

65.0
在Java意义上是双精度的,因为
。如果你想让这个数字成为浮点数,只需在后面加上
f

float d = 65.0;
float d=65.0f

float d = 65.0;
65.0不是浮点值。 它是一个双重值。 输入浮点值时,数字必须以字母f结尾

你看这里

float d = 65.0f;
如果你想在不写字母f的情况下把d给65,你可以这样做

float d = (float)65.0;
这被称为窄铸件

65.0不是浮点值。 它是一个双重值。 输入浮点值时,数字必须以字母f结尾

你看这里

float d = 65.0f;
如果你想在不写字母f的情况下把d给65,你可以这样做

float d = (float)65.0;

这被称为窄型铸造。

正如@Sweeper所说,int到char的位模式不会改变(如果合适的话);它只会删除一些零。但是32位浮点数中数字的位模式与64位浮点数中相同值的位模式有很大不同,,即使两者都可以精确地表示值。哦,这很有意义,基本上,你不能像你可以用字符来表示两倍的数字那样,把浮点数切掉int@NicolasBarone如果您认为我的答案回答您的问题,请考虑通过点击这个复选标记接受它!正如@Sweeper所说,int到char的位模式不会改变(如果合适的话);它只会删除一些零。但是32位浮点数中数字的位模式与64位浮点数中相同值的位模式大不相同,即使两者都能精确表示值。哦,这很有意义,基本上你不能像用字符表示的u一样,将浮点数的位数切成两倍int@NicolasBarone如果你认为我的答案