隐式类型转换

隐式类型转换支持字节数小的类型自动转换为字节数大的类型,整数类型自动转换为小数类型,转换规则如下:

  • byte→short(char)→int→long→float→double

问题:为什么long比float大,还能转换为float呢?小数的存储规则让float的最大值比long还大,只是可能会丢失某些位上的精度!

所以,如下的代码就能够正常运行:

  1. byte b = 9;
  2. short s = b;
  3. int i = s;
  4. long l = i;
  5. float f = l;
  6. double d = f;
  7. System.out.println(d);
  8. //输出 9.0

显示类型转换

显示类型转换也叫做强制类型转换,也就是说,违反隐式转换的规则,牺牲精度强行进行类型转换。

  1. int i = 128;
  2. byte b = (byte)i;
  3. System.out.println(b);
  4. //输出 -128

为什么结果是-128?精度丢失了!

  • int 类型的128表示:00000000 00000000 00000000 10000000
  • byte类型转换后表示:xxxxxxxx xxxxxxxx xxxxxxxx 10000000 => -128

数据类型自动提升

在参与运算时(也可以位于表达式中时,自增自减除外),所有的byte型、short型和char的值将被提升到int型:

  1. byte b = 105;
  2. b = b + 1; //报错!
  3. System.out.println(b);