类型转换

一 自动类型转换

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.

posted @ 2014-12-13 10:58  红红de  阅读(400)  评论(0编辑  收藏  举报