对于中级Java程序员来说,这听起来太微不足道了。但在我审查Java基础知识的过程中,发现了一个问题:
为什么缩小转换范围如下:
byte b = 13;
将允许
int i = 13;
byte b = i;
会被编译器抱怨吗?
答案 0 :(得分:10)
因为byte b = 13 ;
是常量的赋值。它的值在编译时是已知的,因此编译器可以/应该/将会抱怨如果常量值的赋值会导致溢出(尝试byte b = 123456789 ;
并看看会发生什么。)
将其分配给变量后,您将分配表达式的值,虽然它可能是不变的,但编译器不知道这一点。该表达式可能导致溢出,因此编译器发出呜呜声。
答案 1 :(得分:3)
来自here:
分配转换时发生 表达式的值已分配 (§15.26)变量:的类型 表达式必须转换为 变量的类型。分配 上下文允许使用身份 转换(第5.1.1节),扩大 原始转换(第5.1.2节)或a 扩大参考转换 (§5.1.4)。 此外,还有一个缩小范围 如果是,则可以使用原始转换 以下所有条件均为 满足:强>
- 表达式是byte,short,char或int类型的常量表达式。
- 变量的类型是byte,short或char。
- 表达式的值(在编译时已知,因为它是一个常量表达式)可以在变量的类型中表示。
在您的示例中,满足所有三个条件,因此允许缩小转换。
P.S。我知道我引用的来源是旧的,但是语言的这个方面自那以后没有改变。
答案 2 :(得分:0)
因为文字编号没有类型。
一旦你给它一个类型,它必须被转换为另一个:
int i = 13;
byte b = (byte) i;
答案 3 :(得分:0)
一个字节有8位。一个int,32位,它是一个带符号的数字。
答案 4 :(得分:0)
从具有较小幅度范围的数字(如int到long或long到float)的转换称为加宽。扩大转换的目标是在保持尽可能多的精度的同时不改变数字的大小。例如,将int 2147483647转换为float会生成2.14748365e9或2,147,483,650。差异通常很小,但可能很重要。
相反,有可能丢失有关数字大小信息的转换(如long to int或double to long)称为缩小。通过缩小转换,某些信息可能会丢失,但只要有可能,就会找到最近的表示。例如,将float 3.0e19转换为long会产生-9223372036854775807,这是一个非常不同的数字。