rust - 如何在 Rust 中将两个 i16 相加或相乘形成一个 i32 而不会溢出?

标签 rust integer-overflow

如何在 Rust 中将两个 i16 数字相加或相乘成一个更大的 i32 而不会溢出?

let a: i16 = i16::max_value();
let b: i16 = i16::max_value();
let c: i32 = a + b; // throws EO308 "Expected `u32`, found `u16`

最佳答案

Rust 中没有整数提升或隐式转换,因此您必须手动进行所有类型转换。

对于转换,您可以使用 <value> as <type> .但是,如果目标类型是原始类型的超集并且转换它不会丢失信息(例如您的情况),您可以使用 <type>::from 自行记录。 :

let a: i16 = i16::max_value();
let b: i16 = i16::max_value();
let c: i32 = i32::from(a) + i32::from(b);
assert_eq!(c, 65534);

这种特殊情况不会溢出,但对于其他情况,您可以使用 {integer}::checked_*() 防止溢出功能:

let a: i16 = i16::max_value();
let b: i16 = i16::max_value();
let c: Option<i16> = a.checked_add(b);
assert_eq!(c, None); //overflow!

请注意,默认情况下,在调试版本中溢出整数操作会引起 panic 。

如果你想要的是包装算术,就像在旧 C 中一样,你可以使用 {integer}::wraping_*() ,还有一个额外的好处,它适用于有符号和无符号的值。

let a: i16 = i16::max_value();
let b: i16 = i16::max_value();
let c: i16 = a.wrapping_add(b);
assert_eq!(c, -2);

关于rust - 如何在 Rust 中将两个 i16 相加或相乘形成一个 i32 而不会溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57132438/

相关文章:

rust - 为什么 `128u8.checked_shl(1)` 返回 `Some(0)` ?

c - c中的整数提升

Java整数溢出

windows - 我如何知道我的 Rust 编译器正在使用哪个 Windows 工具链?

rust - 获取一周的开始/结束日期

asynchronous - 如何在 Rust 中返回一个返回特征的函数

c++ - 如何处理任意大的整数

java - 使用 Callables 实现 Fibonacci 时静默长溢出

rust - 安全地从流中读取结构的辅助函数

rust - 具有定制包装类型的柴油机