在C#中将带符号整数添加到unsigned

时间:2014-12-27 09:58:25

标签: c# types unsigned signed

即使听起来很简单,C#也很难将有符号整数(偏移量)添加到无符号值:

unsigned uintValue;
int offset;
// ...
uintValue += offset; // causes error CS0266

这可以通过将偏移量转换为有符号值来完成,但这对我来说看起来有点不安全和危险,如果偏移量的类型小于uintValue,则存在风险。 对于这个简单的问题,是否有一个优雅的解决方案,而不使用大量丑陋的类型转换?

在我的申请中,offset可以是正数或负数,否则解决方案将是微不足道的。

3 个答案:

答案 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);