我明白byte b = (byte)(b1 - b2);需要类型转换,那为何float f3 = f1 + f2;不需要强制类型转换?
public class TestConvert {
public static void main(String args[])
{
int i = 1 , j = 12;
float f1 = 0.1f;
float f2 = 123;
long l1 = 12345678, l2 = 8888888888L; //超出范围要加L
double d1 = 2e20, d2 =124;
byte b1 = 1, b2 = 2, b3 = 126; //b3不可以超出127
j = j + 10; //11
i = i / 10; //0
i = (int) (i * 0.1); //0,强制类型转换
char c1 = 'a', c2 = 125;
byte b = (byte)(b1 - b2); //-1,强制类型转换
char c = (char)(c1 + c2 - 1); //221,强制类型转换
float f3 = f1 + f2; //?
float f4 = (float)(f1 + f2 * 0.1); //强制类型转换
double d = d1 * i + j;
float f = (float)(d1 * 5 + d2);
System.out.println(b);
System.out.println(c);
System.out.println(f3);
System.out.println(f4);
System.out.println(d);
System.out.println(f);
}
}

解决方案 »

  1.   

    byte b = (byte)(b1 - b2)
    b1-b2的结果是int类型的,所以要转换。
    byte,char,short运算时都是变成int进行运算,往结果赋值时就要注意了。
    别的没问题。
      

  2.   

    我是问
    为何float f3 = f1 + f2;不需要强制类型转换? 
      

  3.   

    if 两个操作数中有一个是double类型,那么另一个操作数转换为double类型
    else if 两个操作数中有一个是float类型,那么另一个操作数转换为float类型
    else if 两个操作数中有一个是long类型,那么另一个操作数转换为long类型
    else 两个操作数都转换为int
      

  4.   

    运算结果类型与运算中操作数中精度最大的相同
    byte b = (byte)(b1 - b2)  中b1-b2是转换为ASCII码运算结果为 int int占4字节 而byte占1字节 所以要损失精度进行强制类型转换  
    float f3 = f1 + f2; 数据类型没有变化  
    同 int i=123;int j=23;float k;k=i-j;可以 
    float i=123;float j=23;int k;k=i-j; 不行
    要进行强值类型转换  float i=123;float j=23;int k;k=(int)(i-j);
      

  5.   

    我最后补充一下:
    我明白了!
    如果是float f1 = 0.1f; 
    float f2 = 123; 
    float f3 = f1 + f2;
    那么根据规则:
    0.1f 虽然有小数点,但后面有F代表是float,系统不会自动转换为double类型进行数值计算
    123 虽然是数字,但他是float类型,float与double运行时候会转换为double,这里没有与int类型运算,只是float与float,没有遇见小数点,所以计算出f3的结果仍然为float型
    故不需要强制类型转为float f3 = (float) (f1 + f2)感谢各位朋友的帮助,给了我很多思路!