初学者提问:一个关于运算符的问题

zhangchibang311 2006-02-11 09:18:08
第一个程序:
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不是等价的吗?

谁能解答一下啊?

谢谢阿
...全文
125 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangchibang311 2006-02-13
  • 打赏
  • 举报
回复
谢谢 各位
ammd_ye 2006-02-11
  • 打赏
  • 举报
回复
在JAVA里 int 和double 是默认的两类数据转向类型.

也就是说byte,short,long,都会向int类型自动转换.

对于LZ的第一个程序来说: num1=num1*2; 右端的num1*2计算完成以后会自动的提升数据类型到

int,所以赋给左端的num1的时候,编译会报出丢失精度的错误.

改正:num1=(byte)(num1*2)

还有就是LZ你的类名写的有问题,我运行的时候报类名错误,随便改个名字就可以用了.
执假以为真 2006-02-11
  • 打赏
  • 举报
回复
我的猜测为:
2就是寄存器右移1位,但是*2呢,那就是首先要开辟一个空间给一个变量,然后做右移操作,再付给原来的变量。
因为是byte,所以*2时就说是损失了精度,如果把num1改成float或者int型,就没有问题了。两者都可以了。
freego1026 2006-02-11
  • 打赏
  • 举报
回复
byte num1=1;
num1=num1*2;
在运算的时候结果是int型的,而你的num1是byte所以会出现第一个程序编译的时候提示出错:num1=num1*2 可能损失精度
应该这样写 num1=(byte)(num1*2);
第二个程序就可以编译运行
是系统在运行的时候帮你转换了!


jlbqd 2006-02-11
  • 打赏
  • 举报
回复
以前好像有人问过的~

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧