算术操作导致溢出。 (添加整数)
-
16-10-2019 - |
题
我不明白这个错误:
在此呼叫方法setVolume中, 体积 = 2055786000和 尺寸 =93552000。卷是一个整数属性,如您所见,大小也是整数。
该类是DBML实体类的部分类,但是该卷属性不是数据库中的列,它仅存在部分类中,作为“业务对象属性”。
查看详细 显示:
数据>项目 :为了评估索引属性,必须符合资格,并且必须由用户明确提供参数。
什么可能导致这个...?
解决方案
整数的最大值(已签名)是 2147483647
. 。如果该值溢出,则会引发异常以防止程序的意外行为。
如果不抛出这个例外,您将有一个值 -2145629296
为您 Volume
, ,这很可能不想要。
解决方案:使用 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,但在“字节”的情况下,预期的结果为2(258&0xff),但是在Windows应用程序中,您会在A中获得例外控制台,您可能不会(我不这样做,但这可能取决于IDE,我使用Sharp Develop)。
但是,有时需要这种行为(例如,您只关心结果的下部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;
}
或首先声明您的变量,然后在“未检查”部分中进行数学。
或者,如果要强制对溢出进行检查,请改用“检查”。
希望这能清除一切。
Nurchi
PS
相信我,你的朋友是这个例外:)
结果整数值超出了整数数据类型可以保持的范围。
尝试使用INT64
最大值fo ins是2147483647,因此2055786000+93552000> 2147483647及其引起溢出
2055786000 + 93552000 = 2149338000,大于2^31。因此,如果您使用在4个字节上编码的签名整数,则操作的结果不合适,并且会得到溢出异常。
INT的最大尺寸为2147483647。您可以使用更大的int64/long。
当一个值返回为-1。#IND由于分区为零时,我发生了这个错误。有关C ++中IEEE浮点异常的更多信息 在这里 和 约翰·库克(John Cook)
对于那些已经投入了这个答案的人(并且没有说明原因),为什么这个答案对某些人来说很重要的是,零的划分将导致一个无限的数字,因此值不适合一个值INT32(甚至INT64)。因此,您收到的错误将是相同的(算术操作导致溢出),但原因略有不同。