C#: добавление двух больших целых чисел дает неправильный результат

Итак, у меня есть код, который складывает два целых числа и выводит результат:

        Console.WriteLine("enter number: ");
        int intTemp = Convert.ToInt32(Console.ReadLine());
        long sum = intTemp + 5;
        Console.WriteLine($"sum is : {sum}");

Но если в консоли я поставлю максимальное значение для типа int, я не получу исключения, но результат будет неправильным, даже если я сохраню результат в переменной long. Вот результат:

enter number:
2147483647
sum is : -2147483644

Но если переменная суммы длинная, почему я получаю неправильный результат?

3 ответа

Решение

Результат не типа long. Это типаint а затем преобразуется в длинное, чтобы присвоить его переменной типа long.

Что нужно сделать, это следующее:

long sum = (long)intTemp + 5;

или

long sum = intTemp + (long)5;

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

Вы должны преобразовать int "intTemp" в значение задолго до этого, потому что сумма будет преобразована в значение спустя долгое время после завершения вычисления.

Ключ, как уже упоминалось, вам нужно преобразовать одно из значений в long чтобы иметь возможность сохранить правильное значение, поскольку в противном случае значение результата уже будет повреждено до того, как оно будет присвоено long. Я хотел бы предложить вам использоватьMaxValue в этих числовых типах, чтобы сделать расчетную память удобной, если вы будете использовать ее для расчетов. int занимает 32 бита и longзанимает 64 бита. Если результат расчета по-прежнемуintтогда вы можете сэкономить 32 бита хранилища, пока оно вам действительно не понадобится. В вашем примере вы могли бы сделать

if (int.MaxValue - 5) < intTemp ) // it means the value will go above int range if add 5
{
  // Make conversion to target type before the operation
}else{ 
  // the value will still be in int range
}

Тогда вы можете использовать соответствующий тип хранилища для результата. Это может стать довольно эффективным с точки зрения памяти, если вы сохраняете большое количество результатов, а затем используете их для дальнейших вычислений. Надеюсь, это поможет.

Другие вопросы по тегам