考虑以下代码:
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:56:19
是否有一种惯用的方法将
u8添加到i8中?
将u8添加到i8 (使用+)的问题是:结果应该是什么类型?u8或i8都不是更好,使用正确的i16可能会令人惊讶。
因此,目前不支持混合积分操作数.惯用的方法是将两个操作数转换为一个公共类型,这也是结果的类型。这已经是你在做的事了。
但是,
u8 += i8呢?
不幸的是,目前,这是u8 = u8 + i8的糖,因此具有+的所有限制,即使结果类型不是问题。
由于铁锈的所有恼人的限制,有一个RFC为它!我是PR #953: Overloaded Assignment Operations。这个RFC是在最后的评论期,所以一个决定预计很快,这意味着它将被接受和铁锈将获得支持混合积分分配操作。
就目前而言,作为个人喜好,我想:
val = (val as i16 + delta as i16) as u8;这样就避开了树枝。
发布于 2015-08-20 07:36:59
您可以这样做以避免溢出,并包装加法:
val = (val as i8).wrapping_add(delta) as u8;https://stackoverflow.com/questions/32111388
复制相似问题