隐式转换原则
隐式地把值强制转换为相同的类型。编译器首先执行整数提升,如果操作数类型不同,则它们会被转换为下列层次中出现的最高层次的类型:
常用的算术转换不适用于赋值运算符、逻辑运算符 && 和 ||。
强制转换
强制类型转换是把变量从一种类型转换为另一种数据类型。
#include <stdio.h>
int main()
{
int i1 = 20, i2 = 7;
float f;
f = (float)i1 / i2;
printf("%G\n", f);
}
这里把i1强制为float类型,因为强制转换比除法优先级高,所以先执行强制转换。
类型转换注意点
- 整数提升
如果int能够表示原始类型中的所有数值,那么这个数值就被转成int型,否则,它被转成unsigned int型。这种规则被称为整型提升。所有其它类型都不会被整型提升改变。"
char/uchar,short/ushort都可以被int表示。所以当它们做算术运算时,都会被提升成int类型。
为什么会整数提升?
因为对于int类型数据作运算时,CPU运算速度是最快的,所以C语言会对数据作整数提升的处理,使得程序的运行速度尽可能地快。 - 有符号转换为无符号
C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算。也就是说,int/long和对应类型的unsigned int/unsigned int进行运算时,有符号数会自动转换为对应类型的无符号数。
注意:这种转换规则不适用于char/uchar,short/ushort类型,因为这些类型会存在整数提升