两个short类型的数相加为什么不等于一个short类型的数?

4

可能是重复问题:
整数求和的问题,short += short问题

我感觉自己很蠢,因为这还从来没有发生过。我正在尝试做以下操作:

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

answers是一个short类型的数组。Intellisense告诉我result + a是一个int类型,而我不能将其赋值给一个short类型的变量。

我一定是漏掉了什么非常基本的东西,但是不允许两个short类型相加并赋值给一个short类型的变量似乎很奇怪。


4
请参考Eric Lippert在这里的回答,了解为什么会发生这种情况:https://dev59.com/wG855IYBdhLWcg3wbzxl - keyboardP
4个回答

4

由于short是16位整数,如果您添加例如32,00032,000(两个有效的short),则会得到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

我要说的是,在加法过程中进行边界检查更加耗费资源,因此只有在可能发生溢出的情况下(例如两个字节或两个shorts)才应该执行此操作,尤其是当它们可能使用相同数量的内存时。我认为这就是语言的设计方式。


2
我也有同样的想法,但是我可以将相同的逻辑应用于整数,如果我将两个整数相加,那么值可能会大于整数,因此我必须将其分配给bigint。 - peroija
我认为返回int类型的确是正确的原因,因为加法可能导致需要超过16位的值...但为什么必须适用于shorts而不是ints?我真的很好奇。 - Nadir Muzaffar
我搞错了,Int16.MaxValue 实际上是 32767 :) - Mike Christensen
@peroija - 在我的测试中,似乎 Int32 可以转换为 Double - Mike Christensen

0

如果结果大于最大可能的short值,算术运算可能会环绕(到负值)。由于使用short更有可能发生这种情况,并且int具有更大的范围,因此short + short是一个int。


0

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

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

0

正如其他答案中已经指出的那样,两个short值合并成一个int值是有充分理由的。对于你的代码,加法赋值运算符+=重载会返回一个short值,因此你的代码将变为:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接