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