29

我无法理解这个错误:

在此对方法 SetVolume 的调用中,Volume = 2055786000 和size = 93552000。如您所见,Volume 是一个 Integer 属性,并且 size 也是 Integer。

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

查看详情显示:

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

替代文字

这可能是什么原因……?

4

8 回答 8

41

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

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

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

于 2011-01-21T07:54:38.360 回答
7
int.MaxValue = 2147483647
2055786000 + 93552000 = 2149338000 > int.MaxValue

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

于 2011-01-21T07:54:11.283 回答
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;
}

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

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

希望这可以解决问题。

努尔赤

附言

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

于 2013-08-22T23:16:52.213 回答
2

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

尝试使用 Int64

于 2011-01-21T07:54:40.980 回答
1

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

于 2011-01-21T07:54:35.873 回答
0

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

于 2011-01-21T07:56:53.520 回答
0

int 的最大大小为 2147483647。您可以使用更大的 Int64/Long。

于 2011-01-21T07:57:26.037 回答
0

当一个值返回为 -1.#IND 由于被零除时,我发生了这个错误。有关 C++ 中 IEEE 浮点异常的更多信息,请参见SOJohn Cook

对于对这个答案投了反对票(并且没有说明原因)的人,这个答案对某些人来说很重要的原因是除以零将导致无限大的数字,因此一个不适合的值Int32(甚至 Int64)。因此,您收到的错误将是相同的(算术运算导致溢出),但原因略有不同。

于 2014-04-07T10:04:02.853 回答