即使听起来很简单,C#也很难将有符号整数(偏移量)添加到无符号值:
unsigned uintValue;
int offset;
// ...
uintValue += offset; // causes error CS0266
这可以通过将偏移量转换为有符号值来完成,但这对我来说看起来有点不安全和危险,如果偏移量比 uintValue
小,那么风险很大 . 对于这个简单的问题,是否有一个优雅的解决方案,没有使用大量丑陋的类型转换?
在我的应用程序中, offset
可以是正数或负数,否则解决方案将是微不足道的 .
3 回答
我可以想到两种安全的方法;不幸的是,两者都不是特别优雅:
将两个操作数转换为
long
以保证足够的位,执行操作,并将结果转换回unsigned
,或者根据
offset
的符号创建条件,并使用+
或-
与偏移的绝对值,适当地转换为unsigned
.第一种方法更容易编码,但稍微浪费一些,因为它需要额外的四个字节:
但是,它没有条件限制,所以它最终可能会更快 .
Note: 不言而喻,当加法结果为负时,该方案产生无效结果 .
这里需要演员 . Concider如下:
这意味着如果offset是负数,它将使其为正并从uIntValue减少它,如果offset是正数,它将只是添加它
您需要将操作数转换为相同的类型,以补偿可能的负值: