两条短裤加在一起;t等于short

本文关键字:加在一起 等于 short 两条 | 更新日期: 2023-09-27 18:20:48

可能重复:
整数求和蓝色,短+=短问题

这种事正在发生,我感到很愚蠢,但我以前从未发生过这种事。我正在尝试做以下事情:

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

答案是一系列的短句。intellisense告诉我result+a是一个int,我不能将它赋值给short。

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

两条短裤加在一起;t等于short

由于short是16位整数,如果添加32,00032,000(都是有效的shorts),则会得到不是有效short64,000,因为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

我要冒险说,在加法过程中,边界检查更昂贵,因此只有在可能出现溢出(如两个字节或两个短路)的情况下才应该这样做,尤其是当它们可能使用相同数量的内存时。我认为这就是语言的设计方式。

如果结果大于可能的最大短值,则算术运算可以换行(to-ve值)。由于short更有可能发生这种情况,而且int的范围更大,short+short是int。

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

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

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

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