场景一:函数参数类型匹配
- 场景举例:假设有一个函数
add_numbers
,它接受两个i32
类型的参数并返回它们的和。如果调用这个函数时,传入的是两个i16
类型的值,Rust会进行隐式类型转换。
fn add_numbers(a: i32, b: i32) -> i32 {
a + b
}
fn main() {
let num1: i16 = 5;
let num2: i16 = 3;
let result = add_numbers(num1 as i32, num2 as i32);
// 如果不手动转换,Rust会自动将i16隐式转换为i32(在支持这种隐式转换的情况下)
let result_auto = add_numbers(num1, num2);
}
- 转换规则:在Rust中,当小整数类型(如
i16
)作为参数传递给期望大整数类型(如i32
)的函数时,会进行隐式的零扩展(对于无符号整数)或符号扩展(对于有符号整数)。因为i16
的取值范围完全包含在i32
的取值范围内,所以这种转换是安全的,Rust会自动进行。
场景二:算术运算中的类型统一
- 场景举例:在进行算术运算时,如果操作数类型不同,Rust会隐式地将它们转换为同一种类型。例如,将
i32
类型和i64
类型的数相加。
fn main() {
let num1: i32 = 10;
let num2: i64 = 20;
let sum = num1 + num2;
}
- 转换规则:Rust会将较小类型(
i32
)隐式转换为较大类型(i64
)。转换规则遵循“向大类型转换”的原则,以避免数据丢失。在这种情况下,i32
类型的num1
会通过符号扩展转换为i64
类型,然后再进行加法运算。