首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将u8添加到i8的惯用方法

将u8添加到i8的惯用方法
EN

Stack Overflow用户
提问于 2015-08-20 06:52:01
回答 2查看 3.7K关注 0票数 9

考虑以下代码:

代码语言:javascript
运行
复制
let mut val : u8 = 125;
let deltas : [i8; 4] = [5, -5, 5, 5];

let delta = select_current_delta(deltas);

val += delta;

这看起来很简单。我希望根据某些条件增加或减少字节值(而且我有一种防止u8值溢出的方法)。

当然,这并不是编译:

代码语言:javascript
运行
复制
 > 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;
                      ^~~~~

好了!混合签名和无符号类型似乎是禁止在锈菌。这个怎么样?

代码语言:javascript
运行
复制
val = (val as i8 + delta) as u8;

这是编译的,但是当我尝试运行它时..。

代码语言:javascript
运行
复制
> ./lala
thread '<main>' panicked at 'arithmetic operation overflowed', lala.rs:7

是的,i8的最大值是125,添加5会溢出,尽管这个值对u8来说是非常好的。

我想出了两个可行的解决方案:

代码语言:javascript
运行
复制
val = (val as i16 + delta as i16) as u8;
// or
if delta < 0 { val -= (-delta) as u8 }
else { val += delta as u8}

我觉得这两样都不雅致。是否有一种惯用的方法将u8添加到i8中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-20 07:56:19

是否有一种惯用的方法将u8添加到i8中?

u8添加到i8 (使用+)的问题是:结果应该是什么类型?u8i8都不是更好,使用正确的i16可能会令人惊讶。

因此,目前不支持混合积分操作数.惯用的方法是将两个操作数转换为一个公共类型,这也是结果的类型。这已经是你在做的事了。

但是,u8 += i8呢?

不幸的是,目前,这是u8 = u8 + i8的糖,因此具有+的所有限制,即使结果类型不是问题。

由于铁锈的所有恼人的限制,有一个RFC为它!我是PR #953: Overloaded Assignment Operations。这个RFC是在最后的评论期,所以一个决定预计很快,这意味着它将被接受和铁锈将获得支持混合积分分配操作。

就目前而言,作为个人喜好,我想:

代码语言:javascript
运行
复制
val = (val as i16 + delta as i16) as u8;

这样就避开了树枝。

票数 10
EN

Stack Overflow用户

发布于 2015-08-20 07:36:59

您可以这样做以避免溢出,并包装加法:

代码语言:javascript
运行
复制
val = (val as i8).wrapping_add(delta) as u8;

Look here for all the arithmetic operations

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32111388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档