显式转换
通过()
运算符,可以将一个数据类型转换为另一个数据类型。这种转换称为显式转换。例如,将一个int
类型转换为double
类型:
int a = 10;
double b = (double)a;
隐式转换
编译器在编译时,自动将一种数据类型转换为另一种数据类型,这种转换称为隐式转换。例如,将一个int
类型赋值给一个double
类型:
int a = 10;
double b = a; // 隐式转换
隐式转换的规则
- 赋值表达式中,将右边的值转换为左边的类型,然后赋值给左边的变量。
int a = 10;
double b = a; // 隐式转换
- 算术运算式中,低类型能够转换为高类型。
// 从低类型到高类型转换
char, short -> int -> unsigned int -> long -> unsigned long -> float -> double -> long double
// 相加
int a = 10;
double b = 20.5;
double c = a + b; // 隐式转换 a -> double
// 浮点运算
int a = 10;
int b = 3;
float c = a / b; // 3.000000
float d = 1.0 * a / b; // 3.333333 等价于下面的
float e = (float)a / b; // 3.333333
// 高类型转换为低类型
// 损失精度
long a = 1111110000000;
int b = 1;
int c = b + a;
int d = a + b;
printf("c = %d\n", c);
printf("d = %d\n", d);
- 函数调用时,将实参转换为形参的类型。
typedef struct{
int a;
int b;
} data_t;
void func(void* _data) {
data_t* data = (data_t*)_data;
printf("a = %d, b = %d\n", data.a, data.b);
}
int main() {
data_t data = {1, 2};
func(&data); // 隐式转换
return 0;
}
- 逻辑运算式中,将非布尔类型转换为布尔类型。
int a = 10;
if (a) { // 隐式转换
printf("a is true\n");
}