算术运算导致溢出。 (添加整数)

我无法理解这个错误:

在对方法SetVolume的调用中, Volume = 2055786000, size = 93552000.Volume是Integer属性,size也是Integer,如您所见。

该类是dbml实体类的部分类,但是此Volume属性不是数据库中的列,它仅作为“业务对象属性”存在于部分类中。

查看详情显示:

Data> Item :为了评估索引属性,必须限定属性,并且必须由用户显式提供参数。

替代文字

什么可能导致这个…?

整数的最大值(有符号)是2147483647 。 如果该值溢出,则抛出exception以防止程序出现意外行为。

如果不抛出该exception,则您的Volume的值为-2145629296 ,这很可能是不需要的。

解决方案:为您的卷使用Int64 。 最大值为9223372036854775807 ,您可能更安全。

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

因此,您无法将此数字存储为整数。 您可以使用Int64类型,其最大值为9,223,372,036,854,775,807

为简单起见,我将使用字节:

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

如果a,b和c是’int’,你会期望258,但是在’byte’的情况下,预期的结果将是2(258和0xFF),但是在Windows应用程序中你得到一个例外,在一个您可能没有控制台(我没有,但这可能取决于IDE,我使用SharpDevelop)。

但是,有时需要这种行为(例如,您只关心结果的低8位)。

您可以执行以下操作:

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

这样,’a’和’b’都会转换为’int’,添加,然后再转换回’byte’。

为了安全起见,您可能还想尝试:

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

或者,如果您真的想要这种行为,那么更简单的方法是:

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

或者先声明变量,然后在“未选中”部分进行数学运算。

或者,如果要强制检查溢出,请使用“已检查”。

希望这可以解决问题。

Nurchi

PS

相信我,那个例外是你的朋友:)

结果整数值超出整数数据类型可以容纳的范围。

尝试使用Int64

最大值fo int是2147483647,所以2055786000 + 93552000> 2147483647它导致溢出

2055786000 + 93552000 = 2149338000,大于2 ^ 31。 因此,如果您使用以4个字节编码的有符号整数,则操作的结果不适合,并且您会收到溢出exception。

int的最大大小是2147483647.你可以使用更大的Int64 / Long。

当一个值返回为-1时,我发生了这个错误。#IND由于除以零而发生。 有关C ++中的IEEE浮点exception的详细信息,请参阅SO和John Cook

对于那个对这个答案进行了贬低(并没有说明原因)的人来说,这个答案对某些人来说意义重大的原因是,除以零将导致无限大的数字,从而导致一个不适合于Int32(甚至Int64)。 因此,您收到的错误将是相同的(算术运算导致溢出),但原因略有不同。