面试题答案
一键面试不同整数类型的取值范围
- 有符号整数:
i8
: -128 到 127i16
: -32768 到 32767i32
: -2147483648 到 2147483647i64
: -9223372036854775808 到 9223372036854775807i128
: -170141183460469231731687303715884105728 到 170141183460469231731687303715884105727isize
:取决于目标平台,通常和指针大小一致,在64位平台是 -9223372036854775808 到 9223372036854775807 ,在32位平台是 -2147483648 到 2147483647
- 无符号整数:
u8
: 0 到 255u16
: 0 到 65535u32
: 0 到 4294967295u64
: 0 到 18446744073709551615u128
: 0 到 340282366920938463463374607431768211455usize
:取决于目标平台,通常和指针大小一致,在64位平台是 0 到 18446744073709551615 ,在32位平台是 0 到 4294967295
Rust默认处理整数溢出的措施
在 debug 模式下,Rust 默认启用整数溢出检查,当发生溢出时程序会 panic 并终止。在 release 模式下,默认不检查溢出,溢出行为是未定义的,可能会导致程序崩溃或者产生不正确的结果。
自定义溢出行为的实现
- 使用
wrapping_*
方法:- 这些方法执行无检查的算术运算,结果会进行回绕(wrap around)。例如:
let a: u8 = 255;
let b: u8 = 1;
let result = a.wrapping_add(b);
println!("{}", result); // 输出 0
- 使用
saturating_*
方法:- 这些方法执行饱和运算,当发生溢出时,结果会达到类型所能表示的最大或最小值。例如:
let a: u8 = 255;
let b: u8 = 1;
let result = a.saturating_add(b);
println!("{}", result); // 输出 255
- 使用
checked_*
方法:- 这些方法返回
Option
类型,当发生溢出时返回None
,否则返回Some
包含运算结果。例如:
- 这些方法返回
let a: u8 = 255;
let b: u8 = 1;
let result = a.checked_add(b);
match result {
Some(res) => println!("{}", res),
None => println!("发生溢出"),
}