MST

星途 面试题库

面试题:Rust整数类型的取值范围与溢出处理

在Rust中,不同整数类型(如i8、u16等)的取值范围是怎样的?当发生整数溢出时,Rust默认会采取什么措施?如果想要自定义溢出行为,该如何实现?
22.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

不同整数类型的取值范围

  • 有符号整数
    • i8: -128 到 127
    • i16: -32768 到 32767
    • i32: -2147483648 到 2147483647
    • i64: -9223372036854775808 到 9223372036854775807
    • i128: -170141183460469231731687303715884105728 到 170141183460469231731687303715884105727
    • isize:取决于目标平台,通常和指针大小一致,在64位平台是 -9223372036854775808 到 9223372036854775807 ,在32位平台是 -2147483648 到 2147483647
  • 无符号整数
    • u8: 0 到 255
    • u16: 0 到 65535
    • u32: 0 到 4294967295
    • u64: 0 到 18446744073709551615
    • u128: 0 到 340282366920938463463374607431768211455
    • usize:取决于目标平台,通常和指针大小一致,在64位平台是 0 到 18446744073709551615 ,在32位平台是 0 到 4294967295

Rust默认处理整数溢出的措施

在 debug 模式下,Rust 默认启用整数溢出检查,当发生溢出时程序会 panic 并终止。在 release 模式下,默认不检查溢出,溢出行为是未定义的,可能会导致程序崩溃或者产生不正确的结果。

自定义溢出行为的实现

  1. 使用 wrapping_* 方法
    • 这些方法执行无检查的算术运算,结果会进行回绕(wrap around)。例如:
let a: u8 = 255;
let b: u8 = 1;
let result = a.wrapping_add(b);
println!("{}", result); // 输出 0
  1. 使用 saturating_* 方法
    • 这些方法执行饱和运算,当发生溢出时,结果会达到类型所能表示的最大或最小值。例如:
let a: u8 = 255;
let b: u8 = 1;
let result = a.saturating_add(b);
println!("{}", result); // 输出 255
  1. 使用 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!("发生溢出"),
}