class A
{
public static void main(String args[])
{
byte a=3*3;//不提示精度丢失,难道在运算的时候没有自动转换为int型?
byte b=3;
byte b=b*3;//提示精度丢失,此时运算的时候怎么会自动转换成int型?
}
}

解决方案 »

  1.   

    估计有一个模糊精度的概念,当3*3的时候,两个3的精度都是比较模糊的概念,当其结果赋值给byte时,就是byte的精度了。而用byte类型的值*3时,就会认为是用byte*int,最后向高精度转换为int值。最后导致提示精度丢失!
    以上是我的估计。。
      

  2.   

    根据你定义类型时的数据如果不参加运算会自动兼容,但你第7行进行运算后面的数值会成为标准的int型,所以会出现这种情况(定义属性名重复,下次注意).
      

  3.   

    1、Duplicate local variable b2、Cannot convert from int to byte
      

  4.   

    byte a=3*3;//这一句自动计算出了3*3值 ,如果你写成128*1他也是报错的
    byte b=3;
    byte b=b*3//这一句因为用了变量,所以没有算出值,3是int,所以b*3的值是int敷给b时会报错
      

  5.   

    class  A  
    {  
               public  static  void  main(String  args[])  
               {  
                           byte  a=3*3;//不提示精度丢失,难道在运算的时候没有自动转换为int型?  
                           byte  b=3;  
                           byte  c=b*3;//提示精度丢失,此时运算的时候怎么会自动转换成int型?  
               }  
    }
      

  6.   

    byte 站用一个字节空间,表示范围:0-255
    byte a = 3*3;
    这个时候a 站用一个字节空间。值为就,并没有出现越界的现象;
    byte b = 3;
    a = b*3; b多站用的空间为int类型,让int 类型的字节空间缩减为byte类型示为不安全,会导致时局丢失;
      

  7.   

    首先3只是一个字面值,如果说按照你的想法的话,那么就是3为int类型了?呵呵,谁规定的啊?
      

  8.   

    这个问题要怎么说呢?你要知道byte a=3*3;这一句在编译器眼里就是byte a=9;你只要后面的计算值在-128~127之间,就不会报错。你写成byte a=127*1 和byte a=128*1就应该懂 了。
    byte b=a*3;这一句错的原因其实是编译器从安全的角度来看,是不会通过的。你不要想其他,就是从数学的角度这样表达安全吗?所以在运行a*3的时候就要把结果保存为int.再赋值的时候就会错
      

  9.   

    与 Don_Juan 说的一致,由于 3 是 int 类型的,与 b 相乘后也就转型成了 int 类型,只要改成b = (byte) (b*3); 或 b *= 3; 就可以了。
      

  10.   

    有问题用javapC:\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:   returnpublic 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;可能是编译器优化的结果