隐式类型转换通常有两种情况:赋值转换和运算转换。 赋值转换:将一种类型的数据赋值给另外一种类型的变量时,发生隐式类型转换。 比如: 在对变量赋值时,若等号两边的数据类型不同,需要把右边表达式的类型转换为左边变量的类型,这可能会导致数据失真(精度降低),所以隐式类型转换不一定是安全的。 运算转换:C语言中不同类型的数据需要转换成同一类型,才可以进行计算。 字符型、整型、浮点型之间的变量通过隐式类型转换,可以进行混合运算(不是所有数据类型之间都可以隐式转换),转换规则如下: 转换按数据长度增加的方向进行,以保证数据精度不降低。 比如int类型和double类型相加时,int类型就会被隐式转换为double类型,然后再进行运算; 在条件判断中,非布尔类型自动转换为布尔类型。
隐式类型转换
因为字面量 1 是 int 类型,它比 short 类型精度要高,因此不能隐式地将 int 类型向下转型为 short 类型。
short s1 = 1;
// s1 = s1 + 1;
但是使用 += 或者 ++ 运算符会执行隐式类型转换。
s1 += 1;
s1++;
上面的语句相当于将s1 + 1 的计算结果进行了向下转型:
s1 = (short) (s1 + 1);
当你添加 int 和 long 时,
int 对象被强制转换为 long,两者被添加,你会得到 long 对象。
但是长对象不能隐式转换为 int。所以,你必须明确地这样做。
但编码方式是,它执行类型转换。
+=i=(int)(i+m)
在 Java 中,当赋值操作右侧的表达式类型可以安全地提升为赋值左侧的变量类型时,将自动执行类型转换。因此,我们可以安全地分配:
byte -> short -> int -> long -> float -> double.
反之亦然。例如,我们无法自动将 long 转换为 int,因为第一个比第二个需要更多的存储空间,因此信息可能会丢失。要强制进行这种转换,我们必须进行显式转换。