public class AutoPromote
{
public static void main(String[] args)
{
short sValue=5;
sValue=sValue-2;
}
}为什么可以直接将int类型的值直接赋给short类型的变量,而不能计算后得到的int类型的值赋给short类型呢??希望高人指点。

解决方案 »

  1.   

    可能损失精度,如果非要这么做的话,要加强制转换符如下面的:public class AutoPromote
    {
    public static void main(String[] args)
    {
    short sValue=5;
    sValue=(short)(sValue-2);
    }
    }
      

  2.   

    short a=5;
    a++;
    a=a+1;
    a+=1;
    他们是不同的,主要是数据类型的自动转换问题以及精度的丢失!
      

  3.   

    short char 参与数值运算都要先转换成Int型的
      

  4.   

    int 的范围比SHORT要广。因为你在做减法运算的时候有INT类参与,所以结果直接转型为INT。打个比方,用大箱子装小箱子,小箱子无需做任何改变,但是要用小箱子装大箱子,就必须把大箱子压缩一下
      

  5.   

    short sValue=5;  // JAVA里是这么规定的,赋值运算中 比int小的类型,只要右边数字在int范围内自动转换类型的;
                     // 赋值给比int大的类型,只要数值在int内 也不用在后边加 L D 之类的 如
                     //long i = 1231245635; double d = 3143542; float f = 3146524;
    sValue=sValue-2; // 这里右边运算时候 2 默认是int的 故 sValue 也转成int计算后结果是 int的 赋值给short得强转
      

  6.   

    short sValue=5;这是声明一个short类型的变量,在java中是支持的。
    sValue=sValue-2;这是将int类型的数字赋给short类型相当于强制将int类型转换成short类型在java中只支持将小类型转换成大类型而不支持将大类型转换成小类型因为大转小会出现数据丢失的。
      

  7.   

    高精度转换为低精度要强制转换
    2是int类型故转换为short是要强制转换
      

  8.   

    short占16个字节 为短整型 定义范围为 -32768~32767 所以 你赋值一个5给short是绰绰有余的
      

  9.   

    因为 int 的取值范围大于 short. 所以如果要将 int 转为 short 就必须强转
      

  10.   

    我是问为什么可以直接将int类型的值直接赋给short类型的变量,而不能计算后得到的int类型的值赋给short类型呢!!!!
    public class AutoPromote
    {
    public static void main(String[] args)
    {
    short sValue=5;//正确的,int类型可以直接赋给short,byte,char类型
    sValue=sValue-2;//错误的,右边计算的结果是int类型,为什么不能赋给short变量呢??
    }
    }
      

  11.   


    因为short精度比int的小。位数比int少,所以大的不能向小的里面去转,除非强转,小的可以直接向大的转换
      

  12.   

    sValue-2//由自动类型提升,所以(sValue-2)为int型
    而sValue是short型的所以报错
      

  13.   

    我认为short sValue=5;的时候把5当成short的类型给sValue赋值了,没有问题。
    当sValue=sValue-2运算的时候,把2当成int型来运算,自动转换成大的类型也就是结果是int的了,此时再赋值给sValue就会出错了。不知道是不是这样?
      

  14.   


    import java.lang.*;
    import java.io.*;public class Test1
    {
         public static void main(String[] args)
         {
             short sValue=5;
             sValue=(short)(sValue-2);
         }
    }
      

  15.   

    int 类型比 short 类型大,大类型转小类型,必须强转!
      

  16.   

    short占16个坑;
    int占32个坑;
    从编译的角度来讲,你用short存放一个能用16个坑装下的东西,编译器能够自动判断信息是否损失;
    +-*/四则运算的两个因数必须至少是32个坑,比它短的short类型参与计算的时候自动升级,这个过程不会有信息损失所以能够直接通过编译,但是最终至少结果是int;
    从编译器设计来说,把一个32个坑的东西,自动抛弃一部分放到比较小的容器内是很容易的事情,但是编译器希望开发人员对这一信息的损失进行确认,以避免失误,这就是为什么必须加强制类型转换!
    另类的理解,可以参考下!
      

  17.   

    因为5是常量,永远不会变,而sValue是变量名,所以你sValue = sValue - 2;是把一个变量 赋值给了一个short类型的变量,这里JVM考虑了你sValue变大,超出short类型范围的情况,所以报错。
      

  18.   

    建议楼座看看源代码就可以解释了,short的范围 为0到127只要在这个范围内int均可以自动转化为short,而 如果是加我在副值,就要抢至转换了
      

  19.   

    因为2在计算机中默认是int型的 而小变量与大类型的数做运算 得要先转换成大类型变量 再做运算 所以计算所得结果相当于int型的变量  大类型变量要放在小类型变量中必须强制转换
      

  20.   

    short short1 = -32768; //short类型最下值
    short short2 = 32767; //short类型最大值
    //在最小最大之间的都不会出现报错,因为编译器编译期间就已经知道他的确切值了。
    //short1 = short1 + 1; 此时右值已经自动转换成int类型,他的值范围远远大于short的-32768~32767,所以会报错
      

  21.   

    25楼的兄弟,你说的比较好,但是如果这么写的话,怎么办byte a=5;
    a=a+5;//错误,如你所说
    byte b=5;
    b+=5;//正确,可是他不是相当于b=b+5;吗