2012-01-17 89 views
4

可能重复:
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是一个整数,我不能将它分配给一个短。

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

+4

见埃里克利珀的答案在这里,为什么出现这种情况:http://stackoverflow.com/questions/4343624/integer-summing -blues-short-short-problem – keyboardP 2012-01-17 19:37:37

回答

4

由于short是一个16位整数,如果你加入,也就是说,32,00032,000(既有效short S),你会得到64,000这不是一个有效的shortInt16.MaxValue32767

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

UPDATE:

为了好玩,我只是尝试这样做在PowerShell中:

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

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

如果需要,所以看起来像一个Int32可以强制转换为Double

我要去上肢体,并说,如果有一个溢出(如两个字节或两个short)的一个可能的机会界除了在检查比较昂贵,因此只应特别是当他们无论如何,可能会使用相同数量的内存。我认为这就是语言设计的方式。

+2

我有同样的想法,但是我可以将相同的逻辑应用于整数,如果我一起添加两个整数,值可能大于int,因此我必须将其分配给bigint。 – peroija 2012-01-17 19:40:40

+0

绝对认为是返回int的正确理由,因为加法可能会导致需要超过16位的值...但为什么必须适用于添加短裤而不是整数?真正好奇 – 2012-01-17 19:41:02

+0

另外我错了,Int16.MaxValue实际上是32767 :) – 2012-01-17 19:42:59

0

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

0

无论是超载operator+=或更改代码,以便:

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

正如在其他的答案已经指出,有充分的理由为什么是两个短裤做一个int。加法赋值运算符+ =超载返回一个短,所以您的代码将变成:

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