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

32

我无法理解这个错误:

在调用SetVolume方法时,Volume = 2055786000,size = 93552000。您可以看到,Volume是一个整数属性,而size也是整数。

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

查看详细信息显示:

Data > Item:要评估索引属性,必须限定该属性,并且用户必须明确提供参数。

alt text

可能是什么原因呢?

8个回答

43

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

如果不抛出该异常,则您的Volume值将为-2145629296,这很可能不是您想要的结果。

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


1
当我计算前一万个自然数的和时,遇到了一个错误。我正在使用 Int32 数据类型作为求和变量。当我将其更改为 Int64 时,问题得到解决。谢谢。这很有帮助! - RBT
有没有一种方法可以让它溢出而不抛出异常?在我的情况下,溢出是可以接受的。 - Vapid
1
@VapidLinus,“unchecked”关键字可以让你这样做。 - Botz3000

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

所以你不能将这个数字存储到整数中。你可以使用Int64类型,它的最大值为9,223,372,036,854,775,807


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;
}

或者先声明你的变量,然后在“unchecked”部分进行数学运算。

或者,如果你想强制检查溢出,请使用“checked”。

希望这些能澄清问题。

Nurchi

P.S.

相信我,那个异常是你的朋友 :)


2

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

尝试使用Int64。


1

整数的最大值是2147483647,所以2055786000 + 93552000 > 2147483647,导致溢出


0

2055786000 + 93552000 = 2149338000,这个结果大于2^31。因此,如果您使用的是4字节编码的有符号整数,那么操作的结果将无法容纳并且会出现溢出异常。


0

int 的最大值为 2147483647。你可以使用 Int64/Long,它的范围更大。


0

当一个值因为除以零而返回为-1.#IND时,我遇到了这个错误。 关于C++中IEEE浮点异常的更多信息,请参见SO上的这里John Cook的这里

对于那些给这个答案投反对票(并没有说明原因)的人,这个答案之所以对某些人很重要,是因为除以零会导致一个无限大的数,从而产生一个不适合Int32(甚至Int64)的值。 因此,你收到的错误将是相同的(算术运算导致溢出),但原因略有不同。


我实际上点了赞,因为这是好的信息,但我认为负评是因为标题说“添加整数”,而你并没有添加整数。 - DCShannon
谢谢,当然你是正确的,我没有注意到那一部分。 - Daniël Tulp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接