一、C在以下四种情况下会进行隐式转换
1.算术运算式中,低类型能够转换为高类型。
a.若两种类型的字节数不同,转换成字节数高的类型
b.若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
2.赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。
如果右边量的精度较大,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。
3.函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。
4.函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。
即(如果函数的类型和return表达式中的类型不一致,则以函数的类型为准。 函数的类型决定返回值的类型。
对数值型数据,可以自动进行类型转换)
二、 运算表达式中的自动类型转换(优先转为精度高,字节数大,无符号的)
1.字符必须先转换为整数(C语言规定字符类型数据和整型数据之间可以通用) 。
2.short型转换为int型(同属于整型) 。
3.float型数据在运算时一律转换为双精度(double)型,以提高运算精度(同属于实型)
4.注意有符号数与无符号数之间的运算中出现的转换
三、 有符号数与无符号数之间的运算中出现的转换
当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。
因此,从这个意义上讲,无符号数的运算优先级要高于有符号数,
在c语言操作中,如果遇到无符号数与有符号数之间的操作,编译器会自动转化为无符号数来进行处理,
因此a=20,b=4294967166,这样比较下去当然b>a了。
四.自动类型转换 VS 强制类型转换
#include int main(){
int sum = 103; //总数
int count = 7; //数目
double average; //平均数
average = (double) sum / count;
printf("Average is %lf!\n", average);
return 0;
}
运行结果:
Average is 14.714286!
sum 和 count 都是 int 类型,如果不进行干预,那么sum / count的运算结果也是 int 类型,小数部分将被丢弃;
虽然是 average 是 double 类型,可以接收小数部分,但是心有余力不足,小数部分提前就被“抹去”了。
它只能接收到整数部分,这就导致除法运算的结果严重失真。
既然 average 是 double 类型,为何不充分利用,尽量提高运算结果的精度呢?
为了达到这个目标,我们只要将 sum 或者 count 其中之一转换为 double 类型即可。
上面的代码中,我们将 sum 强制转换为 double 类型,这样sum / count的结果也将变成 double 类型,就可以保留小数部分了,average 接收到的值也会更加精确。
( )的优先级高于/,对于表达式(double) sum / count,会先执行(double) sum,
将 sum 转换为 double 类型,然后再进行除法运算,这样运算结果也是 double 类型,能够保留小数部分。
注意不要写作(double) (sum / count),这样写运算结果将是 3.000000,仍然不能保留小数部分。