C语言的类型转化分两种:自动类型转换、强制类型转换。
自动类型转换发生在下列三种情况下:
1、混合运算(不同类型的数据进行运算)
混合运算时的自动类型转换规则是:
double<--<--float
↑
long int
↑
unsigned int
↑
int<--<--char、short
上图中,横向箭头是必须进行的转换(例如两个float类型数据相加,则需要两个都先转换成double类型,然后再进行运算,结果也为double型),纵向箭头是两种不同类型的数据进行运算时需要进行的转换。在混合运算中进行的自动类型转换满足“就高原则”(级别低的类型向级别高的类型转换,箭头指向的方向级别高)。
2、赋值运算
在赋值运算中,编译器会自动将“=”右边的类型转换成“=”左边的类型。例如int a=4.5,则a的值为4.赋值运算中的自动类型转换其实是一种强制转换(不符合混合类型运算中的转换规则)。
3、函数返回值的类型转换。如函数 int f1(){return 34.7;}
强制类型转换的形式是这样的:(新类型名)旧类型变量或常量 ,即把旧类型的变量或常量转换成新类型名类型的值。
如 (int)23.9 结果为23
(double)23 结果为23.000000
注意以下几点:1、长度比较长的类型转换成比较短的类型时,一般是将高位截去,剩下低位给长度短的类型。
2、整型数据转换成浮点型数据时,相当于在整形数后加小数点和若干0.
3、浮点型数据转换成整型数据时,相当于把小数部分去掉。
4、长度短的整形转换成长度长的整形时,根据被转换类型是有符号还是无符号数,高位补足规则是不一样的。无符号数补足高位时,高位全补0.有符号数补足高位时,根据当前的符号位补足(即当前符号位是1,则高位全补1,反之亦同)。这跟逻辑右移和算术右移时高位的补齐规则有点相似。
5、一般较低类型向较高类型转换时,计算机内部存储形式会有变化,但数值大小没有变化。而从较高级类型转换成较低级类型时,会有数据丢失。
6、double类型转换成float类型时,需要通过截尾来实现,结尾之间要进行四舍五入操作。
7、将unsigned类型转换成同样长度的有符号整形数时,数据的计算机内表示形式不变,数值根据不同类型对二进制码的解读规则不同而不同。(有符号数转换成相同长度的unsigned型数据时同理)