c#: добавление двух больших целых дает неверный результат - PullRequest
2 голосов
/ 03 марта 2020

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

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

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

enter number:
2147483647
sum is : -2147483644

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

Ответы [ 3 ]

2 голосов
/ 03 марта 2020

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

. Для этого необходимо следующее:

long sum = (long)intTemp + 5;

или

long sum = intTemp + (long)5;

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

1 голос
/ 03 марта 2020

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

0 голосов
/ 03 марта 2020

Ключ, как уже упоминалось, необходимо преобразовать одно из значений в long, чтобы иметь возможность сохранить правильное значение, так как в противном случае результирующее значение уже повреждено, прежде чем оно будет присвоено long. Я хотел бы предложить, чтобы вы использовали MaxValue в этих числовых c типах, чтобы сделать память вычислений удобной, если вы будете использовать ее для расчетов. 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
}

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

...