隐式转换
一、在算数运算式中,低类型转换为高类型
signed char a = 0xe0;
unsigned int b = a;
unsigned char c = a;
- 同等位数的类型进行赋值时,不会改变在其内存的存储形式,所以第三行语句 c 的位存储形式还是0xe0
- 位扩展:当 a 和 c 进行比较的时候,由于两边都是char(位宽比int小的)型,所以要提升为 int 型;如果原始类型为 signed 进行符号位扩展,如果原始类型为 unsigned 要进行零扩展。
例如: a 为 signed 型:0xe0 => 0x f f f f f f e0,
c 为unsigned型:0xe0=>0x000000e0
二、 赋值表达式中,右边表达式的值会自动隐身转化为左边变量的类型;如果右
边的精度大于左边可能会丢失一部分数据(按四舍五入进行取舍)
三、函数调用的参数传递:系统自动把实参类型转换为形参的类型,然后赋值给形
参;如果函数有返回值,系统又自动将返回表达式的类型转换为返回值类型,
赋值给调用参数;另外如果return的类型和函数返回值的类型不一致,则以函
数的返回值类型为标准。函数的类型决定返回值的类型。
自动转换
在运算表达式中:
shotr / char / unsigned char / unsigned short –> int –> unsigned int–> long –> unsigned long –> double <– float
有符号数和无符号数的转换
如果在表达式中既存在有符号类型也存在无符号类型,则所有的操作数转换为无符号的类型;某种意义上,无符号的优先级要高于有符号。
unsigned int a = 20;
signed int b = -20;
printf("%u\n", b);
if (a > b)
{
printf("a>b\n");
}
else
{
printf("a<b\n");
}
b 和 a 比较的时候系统自动将 b 转换为无符号的一个特大的数,所以 b 大于 a ;
强制类型转换:
int a = 10;
int b = 5;
double c = (double)a / b;
printf("%f", c);
//结果为2.000000
注意事项:在使用强制类型转换的时候必须要加括号,另外强制类型转换和自动转换都是对数据进行临时的转换,不改变数据在定义时的类型。