2011-01-21 97 views
18

我無法理解此錯誤:算術運算導致溢出。 (添加整數)

在該調用方法SetVolume, = 2055786000和大小 = 93552000.體積是一個整數屬性,尺寸也整數,如你可以看到。

類是部分類DBML實體類的,但是這卷屬性不是在數據庫中的列,只在部分類存在,作爲「業務對象屬性」。

詳細介紹所示:

數據>物品:爲了評估索引屬性,該屬性必須是合格的,所述參數必須由用戶顯式提供。

alt text

什麼可能導致此...?

回答

30

的整數的最大值(這是有符號的)是2147483647。如果該值溢出,則拋出異常以防止程序意外行爲。

如果不會拋出此異常,那麼對於您的Volume,您的值爲-2145629296,這可能不是您想要的。

解決方案:爲您的音量使用一個Int64。最大值爲9223372036854775807,您可能更安全一些。

+0

當我遇到此錯誤時,我正在創建前10,000個自然數的總和。我爲summation變量使用Int32數據類型。當我將其更改爲Int64時,問題就解決了。謝謝。它幫助! – RBT 2016-03-30 12:31:16

7
int.MaxValue = 2147483647 
2055786000 + 93552000 = 2149338000 > int.MaxValue 

所以你不能這個數字存儲到一個整數。您可以使用Int64類型,其最大值爲9,223,372,036,854,775,807

1

FO INT最大值爲2147483647,所以2055786000 + 93552000> 2147483647和它引起的溢出

2

結果的整數值是外面的整數數據類型可以容納的範圍之外。

嘗試使用的Int64

0

2055786000 + 93552000 = 2149338000,其大於2^31。因此,如果您使用4字節編碼的有符號整數,則操作的結果不適合,並且會出現溢出異常。

0

爲int的最大大小爲2147483647。你可以使用一個Int64 /長,這要大得多。

3

爲了簡單起見,我將使用字節:

byte a=250; 
byte b=8; 
byte c=a+b; 

如果A,B,和C「廉政」,你所期望的258,但在「字節」的情況下,預期的結果將是2 (258 & 0xFF的),但在Windows應用程序,你會得到一個異常,在控制檯一個你可能不會(我不知道,但這可能取決於IDE,我用SharpDevelop的)。

然而,有時,這種行爲需要(例如,您只關心結果的低8個比特)。

你可以做到以下幾點:

byte a=250; 
byte b=8; 

byte c=(byte)((int)a + (int)b); 

這樣兩個「A」和「B」轉換爲「INT」,接着,添加轉換回「字節」。

爲了安全起見,你也可以試試:

... 
byte c=(byte)(((int)a + (int)b) & 0xFF); 

或者,如果你真的想要這種行爲,以上做的更簡單的方法是:

unchecked 
{ 
    byte a=250; 
    byte b=8; 
    byte c=a+b; 
} 

或者首先聲明你的變量,然後在'unchecked'部分做數學運算。

或者,如果您想強制檢查溢出,請使用'checked'代替。

希望這可以解決問題。

Nurchi

P.S.

信任我,該異常是你的朋友:)

0

時,這個值是通過零返回-1。#IND由於分工發生這個錯誤我。在C++ IEEE浮點異常 更多信息here on SOby John Cook

對於一個誰也downvoted這個答案(並沒有說明具體原因),爲什麼這個答案可以在一定顯著的原因是,除以零會導致一個無限大的數字,因此這個值不適合Int32(甚至Int64)。 所以你收到的錯誤將會是相同的(算術運算導致溢出),但原因稍有不同。

+0

請指出爲什麼這個答案得到了downvote – 2014-10-15 10:09:27

相關問題