1 不同类型数据的混合运算
1.1 不同数值型数据间的混合运算与类型转换
不同类型数据进行混合运算时,首先要把不同类型的数据转换成同一类型,然后进行运算。这种转换由编译系统自动完成,其转换遵循原则如下:
- 在运算中,先进行水平方向上的转换。这种水平方向上转换是必须要进行的。即使是两个char类型的数据进行运算,也要先转换成整型数据再运算。同样的,所有浮点运算都是以双精度进行的。
- 如果在进行了水平方向上的转换后,仍存在不同类型的数据,则要按照纵向方向进行转换。纵向的箭头表示当运算对象为不同类型时转换的方向,即由下向上,数据类型逐步升高。
例如,int型与double型数据进行运算,首先将int型数据转换为double型,然后对两个同类型(double型)数据进行运算,结果为double型。
1.2 赋值运算中的数据类型转换
C语言规定:在赋值运算中,如果赋值运算符两边的类型不一致,但都是数值型或字符型时,在赋值时将进行类型转换。转换时将赋值号右边表达式的类型转换为左边变量的类型。
- 将实型数据(包括单、双精度)赋给整型变量时,实数的小数部分将被舍弃。如i为整型变量,执行i = 3.68 的结果是使i的值为3。
- 将整型数据赋给单、双精度变量时,数值不变,但补足有效位数,以浮点数形式存储在变量中。如将32赋给float型变量f,即f = 32,先将32转换成32.00000,再存储到f中。
- 将一个float型数据赋给double型变量时,数值不变,有效值数扩展到16位,在内存中以64位(bit)存储。
- 将一个double型数据赋给float型变量时,截取其前面7位有效数字,存放到float型变量的存储单元(32位)中。但应注意数值范围不能溢出。
- 字符型数据赋给整型变量时,由于字符只占一个字节,而整型变量位2个字节,因此将字符数据(8位)放在整型变量的低8位中。若字符最高位为0,则整型变量高8位补0;若字符最高位为1,则高8位全补1。这称为“符号扩展”,这样做的目的是使数值保持不变。
- 将一个int、short、long型数据赋给一个char型变量时,只将其低8位原封不动地送到char型变量(即截断)。
- 将带符号的整型数据(int型)赋给long int型变量时,要进行符号扩展。
- 将unsigned int型数据赋给long int,不存在符号扩展问题,只需将高位补0即可。
- 将非unsigned型数据赋给长度相同的unsigned型变量,也要原样赋值(连原有的符号位也作为数值一起传送)。
例如,a为int型变量,值为-1,b为unsigned变量,将a赋给b,那么b的值为65535。
1.3 强制类型转换
强制类型转换是利用强制类型转换运算符将一个表达式转换成所需类型。常被称为显式类型转换,而把自动类型转换称为隐式类型转换,其一般形式为:
(类型符)(表达式)
其功能就是把表达式结果的类型转换为圆括号()中的数据类型。例如:
(double)a
(int)(x + y)
(float)(5 % 3)
注意:表达式一般应该用括号括起来(单个变量可以不加括号)。如果写成:
(int)x + y,则只将x转换成整型,然后与y相加。