天天看点

Java千百问_06数据结构(006)_java基本数据类型如何转换

对于其他7中数值类型,它们之间都可以进行转换,但是可能会存在精度损失或者其他一些变化。 

转换分为自动转换和强制转换。对于自动转换(隐式),无需任何操作,而强制类型转换需要显式转换,即使用转换操作符(type)。

首先将7种类型按下面顺序排列一下:

byte <(short=char)< int < long < float < double

如果从小转换到大,可以自动完成,而从大到小,必须强制转换。short和char两种相同类型也必须强制转换。

自动转换时会发生扩宽 (widening conversion)。因为较大的类型(如int)要保存较小的类型(如byte),内存总是足够的,不需要强制转换。 

如果将字面值保存到byte、 short、char、long的时候,也会自动进行类型转换。 

注意区别,此时从int(没有带l的整型字面值为int)到byte/short /char也是自动完成的,虽然它们都比int小。在自动类型转化中,除了以下几种情况可能会导致精度损失以外,其他的转换都不能出现精度损失。 

1. int –> float 

2. long –> float 

3. long –> double 

4. float –> double without strictfp (无符号double) 

除了可能的精度损失外,自动转换不会出现任何运行时(run-time)异常。

如果要把大的转成小的, 或者在short与char之间进行转换,就必须强制转换,也被称作缩小转换(narrowing conversion)。 

因为必须显式地使数值更小以适应目标类型。强制转换采用转换操作符(type)。严格地说,将byte转为char不属于缩小转换,因为从byte到char的过程其实是byte–>int–>char,所以widening和narrowing都有。

强制转换除了可能的精度损失外,还可能使模(overall magnitude)发生变化。强制转换格式如下:

例如:

但你,如果整数的值超出了byte所能表示的范围,结果将对byte类型的范围取余数。例如:

结果如下: 

1

因为a=257超出了byte的[-128,127]的范围,所以将257除以byte的范围(256)取余数得到:b=1。需要注意的是,当a=200时,此时除了256取余数应该为-56,而不是200。

将浮点类型赋给整数类型的时候,会发生截尾(truncation)。也就是把小数的部分去掉,只留下整数部分。此时如果整数超出目标类型范围,一样将对目标类型的范围取余数。