日期:2014-05-20  浏览次数:20654 次

我真笨,这个问题都想不通,请大家进来帮忙看一下.
class   A
{
public   static   void   main(String   args[])
{
byte   a=3*3;//不提示精度丢失,难道在运算的时候没有自动转换为int型?
byte   b=3;
byte   b=b*3;//提示精度丢失,此时运算的时候怎么会自动转换成int型?
}
}

------解决方案--------------------
学习
------解决方案--------------------
估计有一个模糊精度的概念,当3*3的时候,两个3的精度都是比较模糊的概念,当其结果赋值给byte时,就是byte的精度了。而用byte类型的值*3时,就会认为是用byte*int,最后向高精度转换为int值。最后导致提示精度丢失!
以上是我的估计。。
------解决方案--------------------
根据你定义类型时的数据如果不参加运算会自动兼容,但你第7行进行运算后面的数值会成为标准的int型,所以会出现这种情况(定义属性名重复,下次注意).
------解决方案--------------------
1、Duplicate local variable b

2、Cannot convert from int to byte


------解决方案--------------------
学习
------解决方案--------------------
b*3, 高精度的数据无法隐式的转成高精度的
------解决方案--------------------
byte a=3*3;//这一句自动计算出了3*3值 ,如果你写成128*1他也是报错的
byte b=3;
byte b=b*3//这一句因为用了变量,所以没有算出值,3是int,所以b*3的值是int敷给b时会报错
------解决方案--------------------
确实是一个问题。不错,学习!
------解决方案--------------------
byte 站用一个字节空间,表示范围:0-255
byte a = 3*3;
这个时候a 站用一个字节空间。值为就,并没有出现越界的现象;
byte b = 3;
a = b*3; b多站用的空间为int类型,让int 类型的字节空间缩减为byte类型示为不安全,会导致时局丢失;
------解决方案--------------------
首先3只是一个字面值,如果说按照你的想法的话,那么就是3为int类型了?呵呵,谁规定的啊?
------解决方案--------------------
对不起,错字一打堆,呵呵。
------解决方案--------------------
这个问题要怎么说呢?你要知道byte a=3*3;这一句在编译器眼里就是byte a=9;你只要后面的计算值在-128~127之间,就不会报错。你写成byte a=127*1 和byte a=128*1就应该懂 了。
byte b=a*3;这一句错的原因其实是编译器从安全的角度来看,是不会通过的。你不要想其他,就是从数学的角度这样表达安全吗?所以在运行a*3的时候就要把结果保存为int.再赋值的时候就会错
------解决方案--------------------
与 Don_Juan 说的一致,由于 3 是 int 类型的,与 b 相乘后也就转型成了 int 类型,只要改成

b = (byte) (b*3); 或 b *= 3; 就可以了。
------解决方案--------------------
有问题用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;

可能是编译器优化的结果