考虑以下代码:
let mut val : u8 = 125;
let deltas : [i8; 4] = [5, -5, 5, 5];
let delta = select_current_delta(deltas);
val += delta;这看起来很简单。我希望根据某些条件增加或减少字节值(而且我有一种防止u8值溢出的方法)。
当然,这并不是编译:
> rustc lala.rs
lala.rs:7:12: 7:17 error: mismatched types:
expected `u8`,
found `i8`
(expected u8,
found i8) [E0308]
lala.rs:7 val += delta;
^~~~~好了!混合签名和无符号类型似乎是禁止在锈菌。这个怎么样?
val = (val as i8 + delta) as u8;这是编译的,但是当我尝试运行它时..。
> ./lala
thread '<main>' panicked at 'arithmetic operation overflowed', lala.rs:7是的,i8的最大值是125,添加5会溢出,尽管这个值对u8来说是非常好的。
我想出了两个可行的解决方案:
val = (val as i16 + delta as i16) as u8;
// or
if delta < 0 { val -= (-delta) as u8 }
else { val += delta as u8}我觉得这两样都不雅致。是否有一种惯用的方法将u8添加到i8中?
发布于 2015-08-20 07:36:59
您可以这样做以避免溢出,并包装加法:
val = (val as i8).wrapping_add(delta) as u8;https://stackoverflow.com/questions/32111388
复制相似问题