C# 两条短裤加在一起,don';不等于短?
可能重复:C# 两条短裤加在一起,don';不等于短?,c#,C#,可能重复: 我对这种情况感到很傻,但我以前从未有过这种情况。我正在努力做到以下几点: foreach (short a in answers) { if (a != myConstants.NOTCOMPLETE_SHORT) { result = result + a; } else { empty = true; break; } } 答案是一系列的短裤。intellisen
我对这种情况感到很傻,但我以前从未有过这种情况。我正在努力做到以下几点:
foreach (short a in answers)
{
if (a != myConstants.NOTCOMPLETE_SHORT)
{
result = result + a;
}
else
{
empty = true;
break;
}
}
答案是一系列的短裤。intellisense告诉我result+a是一个int,我不能将它分配给short
我必须在这里遗漏一些非常基本的东西,但不允许将两个short加在一起并分配给一个short变量似乎很奇怪。因为
short
是一个16位整数,如果你加上,比如说,32000
和32000
(都是有效的short
s),您将得到64000
,它不是有效的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
我要冒险说,加法过程中的边界检查更昂贵,因此只有在可能出现溢出(如两个字节或两个短字符)的情况下才应该进行,特别是当它们可能使用相同的内存量时。我认为这正是语言的设计方式。如果结果大于可能的最大短值,则算术可以结束(to-ve值)。由于short更可能发生这种情况,并且int的范围更大,short+short是int。重载
运算符+=
或更改代码,以便:
short a = 6000;
short b = 6000;
result = (short) result + a //answer 12,000
正如在其他答案中已经指出的,有充分的理由说明为什么两个短字符构成int。加法赋值运算符+=重载返回一个短字符,因此您的代码将变为:
foreach (short a in answers)
{
if (a == myConstants.NOTCOMPLETE_SHORT)
{
empty = true;
break;
}
result += a;
}
请看Eric Lippert关于为什么会发生这种情况的回答:我有同样的想法,但我可以将同样的逻辑应用于ints,如果我把两个整数加在一起,那么这个值可能会比整数大,所以我必须把它分配给一个bigint。肯定认为这是返回整数的正确原因,因为一个加法*可能会导致一个需要超过16位的值…但是为什么必须*应用于短整数而不是整数的加法呢?真正奇怪的是,我也错了,Int16.MaxValue实际上是32767:)@peroija-在我的测试中,
Int32
似乎可以转换为双精度。