1.类型转换的相关概念
(1)类型转换分类:自动类型转换(简称“自转”)和强制类型转换(简称“强转”)。
(2)类型提升:编译器对操作数进行运算前,将所有操作数都转换成取值范围较大的操作数类型。
(3)类型提升目的:避免数据信息丢失。因为由于级别高的数据类型比级别低的数据类型所占的内存空间大,可以保持数据类型的精度。
(4)整数提升:char型和short型进行运算前都自动提升为int型,C99和C11中还可以产生向unsigned int型的转换。
(5)类型提升规则:根据操作数类型由低到高进行转换。如图所示,箭头方向表示转换方向,纵向箭头表示必然转换,横向箭头仅表示转换方向不表示转换过程。
比如:一个int型操作数与一个float型操作数进行算数运算,编译器会先将int型直接转换成float型,无需经过int型先转换为unsigned int型再转换为long型的中间过程。
特例:如果一个操作数是long型,另一个是unsigned int型,同时unsigned int型操作数的值又不能用long型表示,则两个操作数都转换为unsigned long型。
2.类型转换的几种情况
(1)赋值中的自动类型转换:赋值运算符左侧(目标侧)变量的类型和右侧表达式的类型不一致,则右侧表达式的值自动转换成左侧变量的类型。
比如:int n = 2; float f = 3.5; double d = n+f,编译器运算n+f时,会将变量n的类型提升为变量f相同的float型,n+f为变量d赋值时,会将float型的运算结果自动转换为double型再赋值给d。
(2)高数据类型转换低数据类型:可能丢失信息。
比如:int转char会丢失高24位,float转int会丢失小数部分(在某些情况下整数部分的精度也会丢失),double转float会丢失小数部分精度(四舍五入)。
(3)低数据类型转换高数据类型:改变数据形式,不会丢失信息。
(4)无符号数据类型(unsigned型)和有符号数据类型(signed型)之间的转换
①unsigned和signed都只能定义整型数据(short,int,long)和字符型数据(char型可以看成特殊的int型),所以un