2011-01-21 93 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

相关问题