c#:将两个大整数相加会得到错误的结果

c#:将两个大整数相加会得到错误的结果,c#,arithmetic-overflow,C#,Arithmetic Overflow,所以我有一个代码,它将两个整数相加并打印结果: Console.WriteLine("enter number: "); int intTemp = Convert.ToInt32(Console.ReadLine()); long sum = intTemp + 5; Console.WriteLine($"sum is : {sum}"); 但是如果在控制台中,我将为int类型输入最大值,我不会得到异常,但是结果是错误的,即使

所以我有一个代码,它将两个整数相加并打印结果:

        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

但是如果sum变量是一个long,为什么会得到错误的结果?

您必须在很久以前将int“intTemp”转换为a,因为sum只在计算完成后很久才会转换为a

结果不是
long
类型。它的类型为
int
,之后转换为long,以便将其分配给
long
类型的变量

要做到这一点,必须做到以下几点:

long sum = (long)intTemp + 5;


执行上述任一操作时,由于一个操作数的类型为(long),因此转换后,另一个操作数也将转换为long,为了将两个值相加,结果将存储到
sum
变量中。

该键类似于前面提到的,您需要将其中一个值转换为
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
}
if(int.MaxValue-5)

然后,您可以为结果使用适当的存储类型。如果您存储大量的结果,然后将其用于进一步的计算,那么它可以变得非常高效。希望有帮助。

因为
intTemp+5
仍然是
int
,然后它被分配到
长的
。您可以使用
intTemp+5L
。应该有一个副本,但我找不到。add运算符不知道(也不应该知道)您打算将其结果存储在哪里,它的类型或大小等。如果您想看到它崩溃并烧坏,请尝试
long sum=checked(intTemp+5)。添加两个
int
s的结果仍然是
int
,即使您最终将其分配给
long
@Damien\u不信者,您的意思是,无论我在哪里添加两个数字,为了100%确定我得到了正确的结果,我需要将其转换为long(假设我将结果保存在一个长变量中)?或
long intTemp=long.Parse(Console.ReadLine())你是说,无论我在哪里添加两个数字,为了100%确保得到正确的结果,我需要将一个转换为long(假设我将结果保存在一个long变量中)基本上,我想说的是,当你期望两个int相加的结果是一个不能用int表示的数字,它可以用long表示时,把一个或另一个操作数转换成long,两个long之间的加法将被执行,而不是两个int之间的加法。
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
}