整型数据和实行数据之间可以进行运算,而且字符型数据可以和整型数据通用,所以整型、实型、字符型数据之间也是可以进行运算的,但在运算处理之前,不同类型的数据要事先转换成同一种数据类型。转换方法有两种:自动转换和强制转换。
(1)自动转换
原则:
1、若参与运算量的类型不同,则先转换成同一类型,然后进行运算;
2、转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int型转换成long型后再进行运算;
3、所有浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再进行运算;
4、char型和short型参与运算时,必须先转换成int型;
5、在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长于左边时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。
需要注意的是,char转为double的过程是一次性的,无需中间过程,其他转换同样。
如果运算中同时包含有符号signed和无符号unsigned的数据,会自动地隐式地将有符号转换为无符号,即signed->unsigned。
举例说明
#include <stdio.h>int main(void)
{int a = -1;unsigned int b = 1;int c = 0;c = a > b ? a : b; return 0;
}
正常逻辑是-1 < 1,所以c的值是1。
但实际运行后c的值是-1。
在编译的时候编译器兄弟也告诉我们:
解析:当运算a > b时,a先自动转换成unsgined,其值即为-1,再与b比较是否比b的值大,结果为真,所以a的值赋值给c。
我们稍微修改代码,让c成为unsigned。
#include <stdio.h>int main(void)
{int a = -1;unsigned int b = 1;unsigned int c = 0;c = a > b ? a : b; return 0;
}
这时候看到结果为
C语言中有符号整型变量把数据的最高位作为符号位使用,因此能表示数的正负;
无符号整型变量把数据的最高位最为数据位使用,因此不能表示负数。
(2)强制转换
强制转换格式为:(数据类型)(表达式)。
需要注意(int)x+y是先把x转换成int型后再与y相加,而(int)(x+y)是把x和y相加的结果转换成int型。
无论是自动转换还是强制转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。