【发布时间】:2019-04-26 11:25:11
【问题描述】:
我是否必须在有符号整数的符号上进行分支,如下例所示? (在实际程序中y被计算为将指向的索引更改为64K数组,并且wraparound是期望的行为)
fn main() {
let mut x: u16 = 100;
let y: i8 = -1;
//x += y;
if y < 0 {
x -= i8::abs(y) as u16;
} else {
x += i8::abs(y) as u16;
}
println!("{}", x);
}
【问题讨论】:
-
@E_net4iskindandwelcoming 链接的问题更多是关于浮点数与整数,而不是混合符号
-
直觉和行动过程都是一样的。混合符号整数之间的算术运算很棘手,如果编译器只是选择了意外的转换规则集(C 和 C++ 就是这种情况),可能会产生奇怪的结果。如果转换是无损的(例如
i16::from(y)),只需使用from关联函数,否则使用as运算符。 -
x = x.wrapping_add(y as u16);? -
或者更好的是
x.wrapping_add(i16::from(y)),以符合cast_losslessClippy lint。
标签: rust