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

时间:2011-01-21 07:50:37

标签: c# vb.net overflowexception

我无法理解这个错误:

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

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

查看详细信息显示:

数据>项目:为了评估索引属性,必须对该属性进行限定,并且必须由用户显式提供参数。

alt text

可能导致这种情况......?

8 个答案:

答案 0 :(得分:34)

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

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

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:3)

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

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

P.S。

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

答案 3 :(得分:2)

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

尝试使用Int64

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

当一个值返回-1时,我发生了这个错误。#IND由于除以零而发生。 有关C ++中here on SOby John Cook

的IEEE浮点异常的更多信息

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