Java 为什么我会得到一个关于“的警告?”;可能的精度损失”;在爪哇?

Java 为什么我会得到一个关于“的警告?”;可能的精度损失”;在爪哇?,java,Java,为什么将添加两个短路的结果分配给一个短路会导致编译错误?在这种情况下,如果32767

为什么将添加两个短路的结果分配给一个短路会导致编译错误?

在这种情况下,如果
32767
s+s1<-32768


-32768-32767
是一个短变量的可能值范围。

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


此外,Java随后将执行整数运算。有关短值的更多信息,请参阅。

因为两个短值的总和将被计算为整数,因此您将为短值指定一个整数

您可以解决此问题,将其重新铸造为短:

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);
    } 
}

因为为了对短路执行算术运算,编译器将首先将短路扩展为整数:

s2=(short)(s+s1);
实际上是

S2 = s + s1

如果右侧有int.

类型,这是因为Java使用
int
s对小整数进行算术运算;添加之后,Java抱怨由于返回到一个较短的时间段而导致精度损失

值得注意的是:

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


  • java中算术运算符的默认返回类型值是否为int数据类型???没有“默认”返回类型。您可能会超出范围,因为一个范围内两个随机数的总和可能大于范围本身。@AndreiPodoprîgora如果我们使用
    int
    而不是
    short
    ,结果不会变成
    long
    ,并且需要强制转换;此加宽行为特定于小于
    int
    的整数类型。当然,溢出仍然是一个值得关注的问题,但警告只是关于截断
    int
    的危险,而不是关于可能的溢出。发生错误的不是“short s=2,s1=200,s2;”行,而是总和。这个答案是错误的。编译器足够聪明,可以告诉您文本值不会溢出short,因此初始化是合法的。正如其他人已经注意到的,Java算术运算符将整数类型扩展为int-width。然后,Java需要一个cast来返回短宽度。
    S2 = (int)s +(int)s1