为什么char c=65起作用而不抛出错误,而float d=65.0起作用而抛出静态错误:赋值中的错误类型:从double到float?他们不是都很悲观吗?
gblwokeq1#
我可以引用jls第5.2节中的一些内容,并说“它是这样工作的,因为语言规范这么说的”,但这并不能令人满意,不是吗?我有根据的猜测,为什么设计这样的语言:转换时 65 到 char ,您真正要做的只是剥离二进制表示中的一堆无关紧要的0,因为 char 是16位,而 int 是32位。就像从0065到65岁。另一方面, 65.0 是一个 double 以浮点格式表示。请注意,通常情况下,此表示仅为真值的近似值。有关更多信息,请参阅此帖子。位数越多,逼近效果越好。所以从 double (64位)到 float (32位)类似于将0.333333转换为0.333。希望你会同意,这是一个更大的信息损失比把0065年到65年。因此,这不是应该自动执行的转换。程序员需要意识到这正在发生。无论如何,为了完整起见,这里是语言规范的相关部分:分配上下文允许使用以下内容之一:...另外,如果表达式是常量表达式(§15.28)类型 byte , short , char ,或 int :如果变量的类型是byte、short或char,并且常量表达式的值可以用变量的类型表示,则可以使用缩小原语转换。因此,语言规范对byte、short、char和int进行了特殊处理,允许它们在赋值上下文中进行缩小转换。请注意,表达式必须是:恒量表达式在目标类型的范围内,所以 char x = 100000; 无效。
65
char
int
65.0
double
float
byte
short
char x = 100000;
7cwmlq892#
float d = 65.0;
65.0不是浮点值。它是一个双倍值。输入浮点值时,数字必须以字母f结尾。你看这里。
float d = 65.0f;
如果你想在不写字母f的情况下把d给65,你可以这样做。
float d = (float)65.0;
这被称为窄铸件。
42fyovps3#
65.0 在java意义上是双重的,因为 . . 如果你想让这个数字成为一个浮点数,只要加上 f 背后。 float d = 65.0f
.
f
float d = 65.0f
3条答案
按热度按时间gblwokeq1#
我可以引用jls第5.2节中的一些内容,并说“它是这样工作的,因为语言规范这么说的”,但这并不能令人满意,不是吗?
我有根据的猜测,为什么设计这样的语言:
转换时
65
到char
,您真正要做的只是剥离二进制表示中的一堆无关紧要的0,因为char
是16位,而int
是32位。就像从0065到65岁。另一方面,
65.0
是一个double
以浮点格式表示。请注意,通常情况下,此表示仅为真值的近似值。有关更多信息,请参阅此帖子。位数越多,逼近效果越好。所以从double
(64位)到float
(32位)类似于将0.333333转换为0.333。希望你会同意,这是一个更大的信息损失比把0065年到65年。因此,这不是应该自动执行的转换。程序员需要意识到这正在发生。无论如何,为了完整起见,这里是语言规范的相关部分:
分配上下文允许使用以下内容之一:
...
另外,如果表达式是常量表达式(§15.28)类型
byte
,short
,char
,或int
:如果变量的类型是byte、short或char,并且常量表达式的值可以用变量的类型表示,则可以使用缩小原语转换。
因此,语言规范对byte、short、char和int进行了特殊处理,允许它们在赋值上下文中进行缩小转换。请注意,表达式必须是:
恒量表达式
在目标类型的范围内,所以
char x = 100000;
无效。7cwmlq892#
65.0不是浮点值。它是一个双倍值。输入浮点值时,数字必须以字母f结尾。
你看这里。
如果你想在不写字母f的情况下把d给65,你可以这样做。
这被称为窄铸件。
42fyovps3#
65.0
在java意义上是双重的,因为.
. 如果你想让这个数字成为一个浮点数,只要加上f
背后。float d = 65.0f