C语言中的隐式转换

关注微信公众号塔容万物

显式转换

通过()运算符,可以将一个数据类型转换为另一个数据类型。这种转换称为显式转换。例如,将一个int类型转换为double类型:

int a = 10;
double b = (double)a;

隐式转换

编译器在编译时,自动将一种数据类型转换为另一种数据类型,这种转换称为隐式转换。例如,将一个int类型赋值给一个double类型:

int a = 10;
double b = a;  // 隐式转换

隐式转换的规则

  1. 赋值表达式中,将右边的值转换为左边的类型,然后赋值给左边的变量。
int a = 10;
double b = a;  // 隐式转换
  1. 算术运算式中,低类型能够转换为高类型。
// 从低类型到高类型转换
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);
  1. 函数调用时,将实参转换为形参的类型。

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;
}
  1. 逻辑运算式中,将非布尔类型转换为布尔类型。
int a = 10;
if (a) { // 隐式转换
  printf("a is true\n");
}