我觉得这种情况发生了愚蠢,但我以前从来没有这样做过。我正在尝试执行以下操作:
foreach (short a in answers)
{
if (a != myConstants.NOTCOMPLETE_SHORT)
{
result = result + a;
}
else
{
empty = true;
break;
}
}
答案是一系列短裤。 intellisense告诉我结果+ a是一个int,我不能将它分配给short。
我必须在这里遗漏一些非常基本的东西,但不允许将两个短裤加在一起并分配给一个短变量似乎很奇怪。
答案 0 :(得分:4)
由于short
是一个16位整数,如果您添加32,000
和32,000
(两个都是有效short
s),则会得到{{1} } 64,000
不是有效short
Int16.MaxValue
是32767
。
因此,加法运算符必须返回一个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;
}