第一个程序:
public class MFirProg{
  public static void main(String[] args){
     byte num1=1;
     num1=num1*2;
     System.out.println("Num="+num1);
     num1=num1*2;
     System.out.println("Num="+num1);
     num1=num1*2;
     System.out.println("Num="+num1);
     num1=num1*2;
     System.out.println("Num="+num1);
     num1=num1*2;
     System.out.println("Num="+num1);
     num1=num1*2;
     System.out.println("Num="+num1);
     num1=num1*2;
     System.out.println("Num="+num1);
     num1=num1*2;
     System.out.println("Num="+num1);
     }
}
第二个程序:
public class MFirProg{
  public static void main(String[] args){
     byte num1=1;
     num1*=2;
     System.out.println("Num="+num1);
     num1*=2;
     System.out.println("Num="+num1);
     num1*=2;
     System.out.println("Num="+num1);
     num1*=2;
     System.out.println("Num="+num1);
     num1*=2;
     System.out.println("Num="+num1);
     num1*=2;
     System.out.println("Num="+num1);
     num1*=2;
     System.out.println("Num="+num1);
     num1*=2;
     System.out.println("Num="+num1);
     }
}
     第一个程序编译的时候提示出错:num1=num1*2 可能损失精度但第二个程序就可以编译运行
num1=num1*2和num1*=2不是等价的吗?谁能解答一下啊?谢谢阿

解决方案 »

  1.   

    byte num1=1;
    num1=num1*2;
    在运算的时候结果是int型的,而你的num1是byte所以会出现第一个程序编译的时候提示出错:num1=num1*2 可能损失精度
    应该这样写 num1=(byte)(num1*2);
    第二个程序就可以编译运行
    是系统在运行的时候帮你转换了!
      

  2.   

    我的猜测为:
    2就是寄存器右移1位,但是*2呢,那就是首先要开辟一个空间给一个变量,然后做右移操作,再付给原来的变量。
    因为是byte,所以*2时就说是损失了精度,如果把num1改成float或者int型,就没有问题了。两者都可以了。
      

  3.   

    在JAVA里 int 和double 是默认的两类数据转向类型.也就是说byte,short,long,都会向int类型自动转换.对于LZ的第一个程序来说: num1=num1*2;  右端的num1*2计算完成以后会自动的提升数据类型到int,所以赋给左端的num1的时候,编译会报出丢失精度的错误.改正:num1=(byte)(num1*2)还有就是LZ你的类名写的有问题,我运行的时候报类名错误,随便改个名字就可以用了.