加在一起的两条短裤不等于短线?

时间:2012-01-17 19:35:17

标签: c#

  

可能重复:
  Integer summing blues, short += short problem

我觉得这种情况发生了愚蠢,但我以前从来没有这样做过。我正在尝试执行以下操作:

foreach (short a in answers)
{
     if (a != myConstants.NOTCOMPLETE_SHORT)
     {
         result = result + a;
     }
     else
     {
         empty = true;
         break;
     }
}

答案是一系列短裤。 intellisense告诉我结果+ a是一个int,我不能将它分配给short。

我必须在这里遗漏一些非常基本的东西,但不允许将两个短裤加在一起并分配给一个短变量似乎很奇怪。

4 个答案:

答案 0 :(得分:4)

由于short是一个16位整数,如果您添加32,00032,000(两个都是有效short s),则会得到{{1} } 64,000不是有效short Int16.MaxValue32767

因此,加法运算符必须返回一个32位的Int,以防止结果可能溢出。

<强>更新

为了好玩,我在PowerShell中试过这个:

PS C:\> ([System.Int32]::MaxValue + [System.Int32]::MaxValue).GetType().Name
Double

PS C:\> (10000000 + 10000000).GetType().Name
Int32

如果需要,Int32 可以投射到Double

我会在一个肢体上说并且在添加期间边界检查更加昂贵,因此只有在可能出现溢出的情况下才会这样做(例如两个字节或两个短路)尤其是当他们可能使用相同数量的内存时。我认为这就是语言设计的方式。

答案 1 :(得分:0)

如果结果大于最大可能的短值,则算术可以回绕(到-ve值)。由于更多可能,这将发生在短期内,并且因为int具有更大的范围,所以short + short是一个int。

答案 2 :(得分:0)

重载operator+=或更改代码,以便:

short a = 6000;
short b = 6000;
result = (short) result + a //answer 12,000

答案 3 :(得分:0)

正如其他答案中已经指出的那样,有两个短路成为一个int的充分理由。添加赋值运算符 + = 重载返回一个short,因此您的代码将变为:

foreach (short a in answers)
{
    if (a == myConstants.NOTCOMPLETE_SHORT)
    {
         empty = true;
         break;
    }
    result += a;
}