为什么在Java中会收到“可能会丢失精度”的警告?

3
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会导致编译错误?
5个回答

5

因为在对short类型进行算术运算时,编译器会先将其扩展为整型:

S2 = s + s1

实际上
S2 = (int)s +(int)s1

右边的类型为int。


2

因为两个short的总和将被评估为int,所以您正在将int分配给short。

您可以通过将其转换回short来解决此问题:

s2=(short)(s+s1);

1
在这种情况下,如果32,767 < s + s1s+s1 < -32,768,可能会发生溢出。 -32,768 - 32,767是一个short变量可能的取值范围。

1
Java中算术运算符的默认返回类型是int数据类型吗? - Bhadri
没有“默认”的返回类型。你可能会超出范围,因为从一个范围内取两个随机数的和可能大于该范围本身。 - StKiller
如果我们使用 int 而不是 short,结果不会变成 long 并要求强制转换;这种扩展行为仅适用于比 int 更短的整数类型。当然,溢出仍然是一个有效的问题,但警告只是关于截断 int 的危险,而不是可能的溢出。 - Theodore Murdock

1

因为当您分配数字文字时,默认为整数。编译器不会检查值以检查精度是否会丢失。

此外,Java将执行整数算术运算。有关短值的更多信息,请参见Java中的原始类型“short” - 强制转换


1
错误不在“short s=2,s1=200,s2;”这一行中,而是在求和中。 - fbafelipe
1
这个答案是错误的。编译器足够聪明,可以判断字面值不会溢出short,因此初始化是合法的。正如其他人已经指出的那样,Java算术运算符将整数类型扩展到int宽度。然后Java需要一个强制转换来返回到short宽度。 - Theodore Murdock

0

这是因为Java在小整数的算术运算中使用int;在加法之后,Java会抱怨由于强制转换回短整型而导致的精度损失。

值得注意的几点:

  1. short数据类型在数组之外很少有用。

  2. 如果总和涉及您要分配的变量,则可以通过使用+=运算符避免需要显式转换,因为复合算术/赋值运算符都意味着对原始变量的类型进行转换(如果必要)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接