2012-01-17 55 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; 
}