【问题标题】:Add signed integer to unsigned in C#在 C# 中将有符号整数添加到无符号数
【发布时间】:2015-02-24 07:10:24
【问题描述】:

尽管听起来很简单,但 C# 使将有符号整数(偏移量)添加到无符号值变得困难:

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

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

在我的应用程序中,offset 可以是正数或负数,否则解决方案将很简单。

【问题讨论】:

  • “这可以通过将偏移量转换为有符号值来完成”它已经是。
  • 不,类型转换并不难,只需根据 offset 的值使用 uintValue 即可。

标签: c# types unsigned signed


【解决方案1】:

这里需要演员表。考虑以下几点:

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

表示如果offset为负数,则使其变为正数,并从uIntValue中减少, 如果偏移量是正数,它会简单地添加它

【讨论】:

    【解决方案2】:

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

    • 将两个操作数都转换为long,以保证有足够的位,执行操作,并将结果转换回unsigned,或者
    • 根据offset的符号做一个条件,用+-加上偏移的绝对值,适当地转换成unsigned

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

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

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

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

    【讨论】:

    • 在经过检查的算术上下文中,如果无符号值回绕,上述操作将失败。取决于它的用途可能是好是坏。太糟糕了,按位 &amp; 运算符没有 UInt32 &amp; UInt64 -&gt; Uint32UInt32 &amp; Int64 -&gt; Uint32UInt64 &amp; UInt32 -&gt; UInt32Int64 &amp; UInt32 -&gt; Uint32 的重载,因为这样的重载将避免在对计算结果进行位掩码时进行愚蠢的转换。跨度>
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-04-26
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 2012-01-09
      相关资源
      最近更新 更多