Array.Sum () приводит к переполнению - PullRequest
0 голосов
/ 31 октября 2018

У меня есть массив типа int

int[] arr = {256741038,623958417,467905213,714532089,938071625};

и затем я создал int64 var

Int64 sum = arr.Sum();

Но это связано с переполнением

Исключение во время выполнения (строка 19): арифметическая операция привела к Переполнение.

Как я могу решить эту проблему, не используя цикл для суммирования? (тип массива должен быть int)

Ответы [ 5 ]

0 голосов
/ 01 ноября 2018

Более короткий путь показан ниже

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

Надеюсь, это поможет вам.

0 голосов
/ 31 октября 2018

Вы можете найти сумму, как показано ниже

using System;

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World");
        int[] arr = {999999999, 999999999, 999999999,999999999, 999999999};
         long sum = 0;
         for (int i = 0; i < arr.Length; i += 1)
         {
           sum += arr[i];
         }
        Console.WriteLine(sum);
    }
}

Тип данных и задание диапазона

0 голосов
/ 31 октября 2018

Вам необходимо привести значения к long (или другому типу данных, который принимает числа, которые слишком велики, но поскольку вы используете Int64 ...):

long sum = arr.Sum(v => (long)v);
0 голосов
/ 31 октября 2018

Когда вы вызываете sum для массива целых чисел, типом вывода является целое число, а сумма введенных чисел превышает целочисленное максимальное значение. как сказал @TheGeneral, метод суммирования проверяет переполнение и создает исключение.

Возможно, вы ожидаете, что метод суммирования возвращает результат как длинный, но его тип возвращаемого значения - целое число.

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
0 голосов
/ 31 октября 2018

Вы должны будете бросить его на длинную, чтобы не переполнить

var result = arr.Select(x => (long)x).Sum();

int (C # Reference)

Диапазон = -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 - вот почему оно выдает:)

проверено (C # Reference)

Проверенное ключевое слово используется для явного включения проверки переполнения для арифметические операции и преобразования целочисленного типа.

...