我真笨,这个问题都想不通,请大家进来帮忙看一下.

longyuxinxinxin 2007-07-18 08:15:19
class A
{
public static void main(String args[])
{
byte a=3*3;//不提示精度丢失,难道在运算的时候没有自动转换为int型?
byte b=3;
byte b=b*3;//提示精度丢失,此时运算的时候怎么会自动转换成int型?
}
}
...全文
565 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lang9527 2007-07-19
  • 打赏
  • 举报
回复
根据你定义类型时的数据如果不参加运算会自动兼容,但你第7行进行运算后面的数值会成为标准的int型,所以会出现这种情况(定义属性名重复,下次注意).
asdfasdf123 2007-07-19
  • 打赏
  • 举报
回复
确实是一个问题。不错,学习!
Don_Juan 2007-07-19
  • 打赏
  • 举报
回复
byte a=3*3;//这一句自动计算出了3*3值 ,如果你写成128*1他也是报错的
byte b=3;
byte b=b*3//这一句因为用了变量,所以没有算出值,3是int,所以b*3的值是int敷给b时会报错
qnprograme 2007-07-19
  • 打赏
  • 举报
回复
b*3, 高精度的数据无法隐式的转成高精度的
longyuxinxinxin 2007-07-19
  • 打赏
  • 举报
回复
结帐
longyuxinxinxin 2007-07-19
  • 打赏
  • 举报
回复
有道理,
zapdos 2007-07-19
  • 打赏
  • 举报
回复
有问题用javap

C:\java>javap -c test
Compiled from "test.java"
class test extends java.lang.Object{
test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return

public static void main(java.lang.String[]);
Code:
0: bipush 9
2: istore_1
3: iconst_3
4: istore_2
5: iload_2
6: iconst_3
7: imul
8: istore_3
9: return

}

正如Don_Juan同学说的byte a=3*3;这一句在编译器眼里就是byte a=9;

可能是编译器优化的结果
  • 打赏
  • 举报
回复
与 Don_Juan 说的一致,由于 3 是 int 类型的,与 b 相乘后也就转型成了 int 类型,只要改成

b = (byte) (b*3); 或 b *= 3; 就可以了。
longyuxinxinxin 2007-07-19
  • 打赏
  • 举报
回复
楼上的真的意思?你说:"你不要想其他,就是从数学的角度这样表达安全吗?所以在运行a*3的时候就要把结果保存为int.再赋值的时候就会错"
谁规定的保存为Int哪本书有写?为什么不保存为double.

算了,我不是给孙鑫老师打电话问一吧,有结果我再发出来,
Don_Juan 2007-07-19
  • 打赏
  • 举报
回复
这个问题要怎么说呢?你要知道byte a=3*3;这一句在编译器眼里就是byte a=9;你只要后面的计算值在-128~127之间,就不会报错。你写成byte a=127*1 和byte a=128*1就应该懂 了。
byte b=a*3;这一句错的原因其实是编译器从安全的角度来看,是不会通过的。你不要想其他,就是从数学的角度这样表达安全吗?所以在运行a*3的时候就要把结果保存为int.再赋值的时候就会错
s74110s 2007-07-19
  • 打赏
  • 举报
回复
学习
Alaylm 2007-07-19
  • 打赏
  • 举报
回复
对不起,错字一打堆,呵呵。
Alaylm 2007-07-19
  • 打赏
  • 举报
回复
首先3只是一个字面值,如果说按照你的想法的话,那么就是3为int类型了?呵呵,谁规定的啊?
Alaylm 2007-07-19
  • 打赏
  • 举报
回复
byte 站用一个字节空间,表示范围:0-255
byte a = 3*3;
这个时候a 站用一个字节空间。值为就,并没有出现越界的现象;
byte b = 3;
a = b*3; b多站用的空间为int类型,让int 类型的字节空间缩减为byte类型示为不安全,会导致时局丢失;
longyuxinxinxin 2007-07-19
  • 打赏
  • 举报
回复
class A
{
public static void main(String args[])
{
byte a=3*3;//不提示精度丢失,难道在运算的时候没有自动转换为int型?
byte b=3;
byte c=b*3;//提示精度丢失,此时运算的时候怎么会自动转换成int型?
}
}
realcbb 2007-07-19
  • 打赏
  • 举报
回复
1、Duplicate local variable b

2、Cannot convert from int to byte

feihua317 2007-07-18
  • 打赏
  • 举报
回复
估计有一个模糊精度的概念,当3*3的时候,两个3的精度都是比较模糊的概念,当其结果赋值给byte时,就是byte的精度了。而用byte类型的值*3时,就会认为是用byte*int,最后向高精度转换为int值。最后导致提示精度丢失!
以上是我的估计。。
joejoe1991 2007-07-18
  • 打赏
  • 举报
回复
学习

62,623

社区成员

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

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