一 自动类型转换
1. 非赋值运算的类型转换
水平方向的转换:所有的 char, short 型自动转换成 int 型,左右的 unsigned short 型自动转换成 unsigned 型,所有的 long 型自动转换成 unsigned long 型,所有的 float 型自动转换成 double 型。
垂直方向:经过水平方向的转换,如果参加运算的数据类型仍然不相同,再将数据自动转换成其中级别最高的类型。
栗子 -----------
设变量 ac 的类型是 char, 变量 bi 的类型是 int , 变量 d 的类型是 double ,求解表达式 ac + bi - d。运算次数是:先计算 ac + bi, 将 ac 转换为 int 型后求和,结果是 int 型, 再将 ac + bi 的和转换为 double 型, 再与 d 相减, 结果是 double 型。
2.赋值运算的类型转换
赋值运算时,将赋值号右侧表达式的类型自动转换成赋值号左侧变量的类型。
例如:
.变量 x 的类型是 double, 计算表达式 x = 1. 运算时,先将 int 型常量 1 转换成 double 型常量 1.0 ,然后赋值给 x , 结果是 double 型。
.short a; char b; long c ; c = a + b; 先计算 a + b, 将 a, b 转换为 int 型求和,结果是 int 型;再将和转换成 c 的类型 long ,然后赋值给 c, 结果是long 型。
利用上面的规则,如果赋值号右侧表达式的类型比赋值号左侧变量的类型界别高,运算精度会降低。
如 int i = 2.56 运算时先将 double 型常量 2.56 转换成 int 型常量 2, 然后赋值给 i , 结果是 int 型。
所以:在赋值运算时,赋值号两侧的数据类型最好相同,至少右侧数据的类型要比左侧数据的类型几倍地,或者右侧数据的值在左侧变量的取值范围内,否则会导致运算精度降低,甚至出现意想不到的结果。
二 强制类型转换
使用强制类型转换运算符,可以将一个表达式转换成给定的类型。
(类型名)表达式;
例:(int)3.8 = 3;
注意:无论是自动类型转换,还是强制类型转换,都是为了本次运算的需要,对数据的类型进行临时转换,并没有改变数据的定义,其本质依然还是自己原先的数据类型。
例如现在有 int i; (double)i 是 double 型,i 的类型并没有改变,仍然是 int 型。
强制类型转换运算符的优先级较高,结合性是从右到左。
(int)3.8 + 1.3 等价 ((int) 3.8) + 1.3 结果是 4.3; 而 (int)(3.8 + 1.3) 的结果是 5.