专题三:隐式转换
1. 表达式
一个表达式中,往往会有不同类型的数据做运算,那么级别低的类型会默认转换为级别高的类型,然后做运算
double
^
long
^
int
^
char
在进行运算时,以表达式中最长类型为主,将其他类型位据均转换成该类型如:
(1)若运算数中有double型或float型,则其他类型数据均转换成double类型进行算。
(2)若运算数中最长的类型为long型.则其他类型数均转换成long型数。
(3)若运算数中最长类型为int型,则char型也转换成int型进行运算。算术转换是在运算过程中自动完成的。
特别注意的是有符号和无符号之间的转换:
(1).包含long与unsigned int,32位机器上都是4字节,所以均转换为unsigned long.
(2).包含signed与unsigned int,signed会转换为unsigned。如果int恰好为负数,其结果为对unsigned取值个数求模的结果。比如将-1赋给8位的unsigned char,呢么结果就是255(-1对256取模后的值)。unsigned char取值范围0~255。
2. 赋值语句
进行赋值操作时,赋值运算符右边的数据类型必须转换成赋值号左边的类型,若右边的数据类型的长度大于左边,则要进行截断或舍入操作。
3. 函数传参
函数在传参的过程中,实参默认会转换为形参类型,如果实参类型长度大于形参长度,则要进行截断或舍入操作
4. 函数返回值
函数在返回值的过程中,return后面的数据类型会默认转换为函数名前面指定的类型,如果前者长度大于后者长度,则要进行截断或舍入操作
讨论:
unsigned char a = 0xa5;
unsigned char b = ~a >> 1 + 2 +3;
printf("%d\n", b)的结果是多少?
int a = 10;
printf("%d %d\n", sizeof(a=10.0), sizeof(a+10.0));的结果是多少?
1>0 ? 1:"1";这条语句正确吗?为什么?