class Test
{
public static void main(String[] args)
{
short s=2,s1=200,s2;
s2=s+s1; // error: "possible loss of precision"
System.out.println(s2);
}
}
为什么将两个short相加的结果赋值给一个short会导致编译错误?
class Test
{
public static void main(String[] args)
{
short s=2,s1=200,s2;
s2=s+s1; // error: "possible loss of precision"
System.out.println(s2);
}
}
因为在对short类型进行算术运算时,编译器会先将其扩展为整型:
S2 = s + s1
S2 = (int)s +(int)s1
右边的类型为int。
因为两个short的总和将被评估为int,所以您正在将int分配给short。
您可以通过将其转换回short来解决此问题:
s2=(short)(s+s1);
32,767 < s + s1
或s+s1 < -32,768
,可能会发生溢出。
-32,768 - 32,767
是一个short变量可能的取值范围。因为当您分配数字文字时,默认为整数。编译器不会检查值以检查精度是否会丢失。
此外,Java将执行整数算术运算。有关短值的更多信息,请参见Java中的原始类型“short” - 强制转换。
这是因为Java在小整数的算术运算中使用int
;在加法之后,Java会抱怨由于强制转换回短整型而导致的精度损失。
值得注意的几点:
如果总和涉及您要分配的变量,则可以通过使用+=
运算符避免需要显式转换,因为复合算术/赋值运算符都意味着对原始变量的类型进行转换(如果必要)。
int
而不是short
,结果不会变成long
并要求强制转换;这种扩展行为仅适用于比int
更短的整数类型。当然,溢出仍然是一个有效的问题,但警告只是关于截断int
的危险,而不是可能的溢出。 - Theodore Murdock