Pet*_*ron 3 integer-overflow rust
如何i16在Rust 中将两个数字相加或相乘成一个更大的数i32而不会溢出?
let a: i16 = i16::max_value();
let b: i16 = i16::max_value();
let c: i32 = a + b; // throws EO308 "Expected `u32`, found `u16`
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
这种特殊情况不会溢出,但是对于其他情况,您可以使用{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!
Run Code Online (Sandbox Code Playgroud)
请注意,在调试版本中,默认情况下会溢出整数运算恐慌。
如果您要包装算术,就像在旧的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);
Run Code Online (Sandbox Code Playgroud)
您可以将它们都投射到i32添加之前。
let c: i32 = (a as i32) + (b as i32);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |