我有一个这样的int数组
int[] arr = {256741038,623958417,467905213,714532089,938071625};
然后我创建了一个int64变量
Int64 sum = arr.Sum();
但是这导致了溢出
运行时异常(第19行):算术运算导致 溢出。
如何不使用循环将其总结而解决此问题? (数组类型必须为int)
答案 0 :(得分:7)
您需要将值强制转换为long
(或其他需要使用大数字的数据类型,但由于您使用的是Int64 ...):
long sum = arr.Sum(v => (long)v);
答案 1 :(得分:3)
您必须将其强制转换很长时间,以免溢出
var result = arr.Select(x => (long)x).Sum();
范围=
-2,147,483,648
至2,147,483,647
某些背景,这是Sum
的源代码
public static int Sum(this IEnumerable<int> source)
{
if (source == null) throw Error.ArgumentNull("source");
int sum = 0;
checked
{
foreach (int v in source)
sum += v;
}
return sum;
}
意思是,不管您是否喜欢,有人正在使用for循环,另外使用checked
就是抛出它的原因:)
checked关键字用于显式启用以下内容的溢出检查: 整型算术运算和转换。
答案 2 :(得分:0)
在整数数组上调用sum时,输出类型为整数,并且输入数字的总和大于整数最大值。就像@TheGeneral所说的sum方法检查溢出并抛出异常。
您可能希望sum方法的返回结果很长,但是其返回类型是整数。
int a = 256741038;
int b = 623958417;
int c = 467905213;
int d = 714532089;
int e = 938071625;
long sumInt = a + b + c + d + e;
//-1293758914 //overflow happened withoud exception
long sumLong = (long)a + b + c + d + e;//clr now the result may be more than int.maxvalue
//3001208382
答案 3 :(得分:0)
答案 4 :(得分:0)
一个较短的方法如下所示
using System;
namespace Test
{
public partial class TestPage : System.Web.UI.Page
{
public int[] p = { 999999999, 999999999, 999999999, 999999999, 999999999 };
protected void Page_Load(object sender, EventArgs e)
{
long s = Sum;
}
public long Sum
{
get { long s = 0; Array.ForEach(p, delegate (int i) { s += i; }); return s; }
}
}
}
希望这会对您有所帮助。