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
}
Тогда вы можете использовать соответствующий тип хранилища для результата. Это может стать довольно эффективным с точки зрения памяти, если вы сохраняете большое количество результатов, а затем используете их для дальнейших вычислений. Надеюсь, это поможет.