1.隐式类型转换(自动类型转换)
- 算术运算中的转换
在进行算术运算时,C 语言会自动将不同类型的数据转换为同一种类型,转换规则通常是向精度更高的数据类型转换。
例如,当一个int类型和一个float类型进行加法运算时,int会自动转换为float类型。
例:
int a = 5;
float b = 3.5;
float c = a + b;
在计算a + b时,a会被自动转换为float类型(即 5.0),然后与b相加,得到c的值为 8.5。
- 赋值运算中的转换
当把一个表达式的值赋给一个变量时,如果表达式类型和变量类型不一致,会发生隐式转换,不过可能会导致精度损失。
例如,
float f = 3.14;
int i = f;
这里i的值为 3,因为float类型的3.14在赋值给int类型变量时,小数部分被截断。
2.显式类型转换(强制类型转换)
1. 基本语法及示例(基本数据类型)
基本语法为(目标类型)表达式。
- 整数和浮点数之间的转换
例如,将int转换为float:
int num1 = 10;
float num2 = (float)num1;
此时num2的值为 10.0。
反过来,将float转换为int:
float num3 = 3.9;
int num4 = (int)num3;
num4的值为 3,小数部分被截断。
- 不同整数类型之间的转换
例如,将short转换为int:
short s = 20;
int i = (int)s;
i的值为 20。
又如,将long转换为int(要注意范围):
long l = 2147483648L;
int j = (int)l;
由于2147483648L超出了int(通常范围是 - 2147483648 到 2147483647)的范围,j的值可能会因溢出而不正确。
2. 指针类型的转换(有风险)
例如,假设有int类型指针转换为char类型指针。
例:
int *int_ptr = (int *)malloc(sizeof(int));
*int_ptr = 10;
char *char_ptr = (char *)int_ptr;
这里将int_ptr强制转换为char_ptr后,通过char_ptr访问内存是按照char类型字节数(通常为 1 字节)读取,和通过int_ptr按int类型字节数(通常为 4 字节)读取不同,可能导致错误。
3. 函数参数传递中的转换
例如,有函数void print_int(int num),要传入float类型的值。
例:
float f = 3.5;
print_int((int)f);
这里将float类型的f强制转换为int类型后传入函数,不过可能会丢失数据,因为3.5转换为int后为 3。