什么是类型转换
当两个不同类型的数据,进行算数运算时,就需要将两个数据转换成同一类型,再运算,这就叫类型转换。
注意,类型转换只是发生在计算过程中,并不更改变量或常量本身的类型。
隐式类型转换
经常写代码的同学都知道,进行算术运算时,运算符两边的数据类型,有时候会不一样,C编译器在处理的时候,会将两种类型转换为同一类型后,再进行计算。这种处理对程序员是透明的。
隐式类型转换的规则
隐式转换的前提是,参与运算的两个数,类型不同。
若参与运算的两个数中,有浮点数:
如果任何一个操作数是 double型,则在运算时,另一个操作数,也转换为double型,运算结果为 double ,
否则,如果任何一个操作数是 float 型,则在运算时,另一个操作数,也转换为float型,运算结果为float;
如果参与运算的,是两个不同类型的整数:
此时会将较短的类型,扩展为较长的类型,再进行计算,扩展算法为:
- 如果较短的类型是有符号的,则进行符号扩展;
- 如果较短的类型是无符号的,则高位补 0 。
显示类型转换
经常写代码的同学都知道,隐式类型转换,有时候转换的方法,不一定跟想象的一样,造成运算结果不符合预期。因此,C语言里定义了显示类型转换。显示类型转换的格式如下:
(类型名)(操作数);
这里的操作数,可以是变量,也可以是常量,先上代码:
int main(void)
{int iA = 1000 ;char cA = -1 ;unsigned char ucB= -1 ;printf("iA == %d, cA == %d, ucB == %d\r\n", iA, cA, ucB);// 将 cA 强制转化为 int型printf("iA + (int)cA == %d\r\n", iA + (int)cA);// 将 ucB 强制转化为 int型printf("iA + (int)ucB == %d\r\n", iA + (int)ucB);// 将 iA 强制转化为 char型printf("(char)iA + cA == %d\r\n", (char)iA + cA);// 将 iA 强制转化为 unsigned char型printf("(unsigned char)iA + ucB == %d\r\n", (unsigned char)iA + ucB);
}
运行结果如下:
ucB 明明赋值为 -1 ,但是打印时却是 255,这个好解释,因为 ,所以无符号的时候 -1 就是255,有符号的时候 255 就是 -1,相信大家能理解,是吧。
(unsigned char)iA + ucB 的结果,看起来也很奇怪,明明是做加法,但是运算结果比 1000 小,比255 大,这个坑先留着,到后面再解释。