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);
}
}
为什么将短路添加两个短路的结果分配给编译错误?
答案 0 :(得分:5)
因为为了对short执行算术运算,编译器会首先将它们扩展为整数:
S2 = s + s1
实际上是
S2 = (int)s +(int)s1
右侧有int类型。
答案 1 :(得分:2)
因为两个短路的总和将被评估为一个int,所以你要为一个短路分配一个int。
你可以简单地解决这个问题:
s2=(short)(s+s1);
答案 2 :(得分:1)
在这种情况下,如果32,767 < s + s1
或s+s1 < -32,768
-32,768 - 32,767
是一个短变量的可能值范围。
答案 3 :(得分:1)
因为当您指定数字文字时,它默认为整数。编译器不会检查该值以检查精度是否会丢失。
此外,Java将执行整数运算。有关短值的更多信息,请参阅Primitive type 'short' - casting in Java。
答案 4 :(得分:0)
这是因为Java使用int
来进行小整数运算;在添加之后,Java抱怨由于重新缩短而导致精度损失。
值得注意几件事:
如果总和涉及您要分配的变量,则可以避免使用+=
运算符进行显式强制转换,因为复合算术/赋值运算符都意味着强制转换到原始变量的类型(如果有必要)。