如何在 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/