首页 文章

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

提问于
浏览
2

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

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

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

在我的应用程序中, offset 可以是正数或负数,否则解决方案将是微不足道的 .

3 回答

  • 1

    我可以想到两种安全的方法;不幸的是,两者都不是特别优雅:

    • 将两个操作数转换为 long 以保证足够的位,执行操作,并将结果转换回 unsigned ,或者

    • 根据 offset 的符号创建条件,并使用 +- 与偏移的绝对值,适当地转换为 unsigned .

    第一种方法更容易编码,但稍微浪费一些,因为它需要额外的四个字节:

    uintValue = (unsigned)((long)uintValue + offset);
    

    但是,它没有条件限制,所以它最终可能会更快 .

    Note: 不言而喻,当加法结果为负时,该方案产生无效结果 .

  • 0

    这里需要演员 . Concider如下:

    uIntValue = ( offset < 0 ?
                   uIntValue - (uint)(offset * (-1)) :
                   uIntValue + (uint)(offset) );
    

    这意味着如果offset是负数,它将使其为正并从uIntValue减少它,如果offset是正数,它将只是添加它

  • 0

    您需要将操作数转换为相同的类型,以补偿可能的负值:

    uint uintValue = 1000;
            int offset = -1000;
            uintValue = (offset < 0 ? uintValue - (uint)(-1 * offset) : uintValue + (uint)offset);
    

相关问题