学科分类
目录
C语言

隐式类型转换

显式类型转换指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型,其基本语法格式如下所示:

(类型名)(表达式)

在上述格式中,类型名和表达式都需要用括号括起来,具体示例如下:

int x = 10;
float f = 1.2;
double d = 3.75;
x = (int)(f + d);       //将f+d的结果强制转换为int类型,再赋值给变量x
f = (double)(x)+d;       //将x强制转换为double类型,与d相加,再将结果赋值给f

上述代码中,首先定义了三个变量:int类型的变量x,float类型的变量f,double类型的变量d;然后让f与d相加,将结果强制转换为int类型再赋值给变量x,x结果为4。最后一行代码将x强制转换为double类型,将其与d相加,再赋值给f,f结果为7.750000。

在上述类型转换过程中,对于代码x = (int)(f + d);,f是float类型,d是double类型,f与d相加时,编译器先将f转换为double类型,再与d相加。f与d相加的结果为double类型,在将结果赋值给x时,即使不强制将结果转换int类型,编译器也会将结果先转换为int类型再赋值给x,即发生赋值转换。

对于代码f = (double)(x)+d;,先将x强制转换为double类型再与d相加,但在这个过程中,即使不强制转换,x与d相加时,编译器也会将x自动转换为double类型。x与d相加的结果为double类型,将结果赋值给f时会发生赋值转换,即先将结果转换为float类型再赋值给f。

在面向对象的编程语言中,有很多用户自定义的对象,对象之间类型不一致往往会导致程序错误,因此常常需要强制转换,统一操作对象的数据类型。C语言是一门面向过程的编程语言,数据类型转换一般发生在基本数据类型之间,基本数据类型之间的转换又默认有自己的一套规则(隐式转换),因此,显式转换并不常用。

对数据类型转换,如果由低字节数据类型向高字节数据类型转换,一般不会出现错误,但如果由高字节数据类型向低字节数据类型转换,则可能会因数据截断造成精度丢失,具体如下:

(1)浮点类型与整型的转换

将浮点数转换为整数时,编译器会舍弃浮点数的小数部分,只保留整数部分。将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式,即小数点后带若干个0。

(2)单、双精度浮点类型的转换

因为C语言中的浮点类型数据总是用双精度表示的,所以float类型数据参与运算时需要在尾部加0扩充为double类型数据。double类型数据转换为float类型时,会造成数据精度丢失,有效位以外的数据将会进行四舍五入。

(3)char类型与int类型的转换

将int类型数值赋给char类型变量时,只保留其最低8位,高位部分舍弃;将char类型数值赋给int类型变量时,一些编译器不管其值大小都作正数处理,而另一些编译器在转换时会根据char类型数据值的大小进行判断,若值大于127,就作为负数处理。对于使用者来讲,如果原来char类型数据取正值,转换后仍为正值。如果原来char类型值可正可负,则转换后也仍然保持原值,只是数据的内部表示形式有所不同。

(4)int类型与long类型的转换

long类型数据赋给int类型变量时,将低16位值赋给int类型变量,而将高16位截断舍弃(这里假定int类型占两个字节)。将int类型数据赋给long类型变量时,其外部值保持不变,而内部形式有所改变。

(5)无符号整数之间的转换

将一个unsigned类型数据赋给一个长度相同的整型变量时(如:unsigned→int、unsigned long→long,unsigned short→short),内部的存储方式不变,但外部值却可能改变。

将一个非unsigned整型数据赋给一个长度相同的unsigned类型变量时,内部存储形式不变,但外部表示时总是无符号的。

点击此处
隐藏目录